我正在尝试使用 PowerShell 为 SQL Server 实例获取具有数据类型(和长度)的列名。我走了这么远:
#Load PSSnapin
Add-PSSnapin *SQL*
#Get column names
$colNames = dir 'SQLSERVER:\SQL\MYCOMPUTER\MYSQLINSTANCE\Databases\MYDATABASE\Tables' |
Where-Object {$_.DisplayName -match "dbo.MYTABLE"} |
ForEach-Object {$_.Columns} |
Select-Object Name, DataType
$colNames
Run Code Online (Sandbox Code Playgroud)
如何获取列的数据类型长度?
我已经使用Get-MSSQLLinkPasswordsPowershell 脚本很长时间了,它提供了巨大的帮助。该脚本解密特定 Windows 服务器上所有链接服务器的密码,并以纯文本形式显示给您。此功能甚至已合并到dbatools Copy-SqlLinkedServer脚本中。
运行脚本有一些安全注意事项,如下所示
该脚本必须在 MSSQL 服务器上本地运行(因为 DPAPI 需要访问本地机器密钥)。执行脚本的用户还必须具有对所有数据库实例(用于 DAC 连接)的 sysadmin 访问权限和 Windows 服务器上的本地管理员权限(以访问注册表中的熵字节)。此外,如果启用了 UAC,则必须以管理员身份运行该脚本。
在最近升级到 SQL Server 2016 之前,此脚本一直运行良好。我想知道是否有人在 SQL Server 2016 下遇到过此脚本的任何问题。也许 SQL Server 2016 中的某些安全模型已更改,并且此脚本无法解密密码现在。
如果时间允许,我将尝试查看该dbatools Copy-SqlLinkedServer脚本是否仍然适用于 2016 年。
sql-server powershell linked-server sql-server-2016 dbatools
我有以下 PowerShell 脚本可在共享位置创建文件夹。该共享对每个人都具有完全控制权限。我已授予所有测试权限。
问题是当我手动执行时脚本工作正常。当我作为 SQL Server 代理服务帐户执行它时,它也能正常执行。但是当我尝试作为 SQL Server 代理作业的一部分执行时,相同的脚本失败。我在这里错过了什么吗?
$path = "\\server\shared\path\01222020"
New-Item -path $path -ItemType Directory -Force
Exception:
Date 1/22/2020 5:25:10 PM
Log Job History (test)
Step ID 1
Server serverA
Job Name Test
Step Name Test
Duration 00:00:01
Sql Severity 0
Sql Message ID 0
Operator Emailed
Operator Net sent
Operator Paged
Retries Attempted 0
Message
Executed as user: domain\agent_service_account. A job step received an error at
line 9 in a PowerShell script. The corresponding line is …Run Code Online (Sandbox Code Playgroud) 架构表归 dbo 和另一个架构名称所有。下面的代码没有在任何表格上移动。我还需要添加其他东西才能传输表格吗?没有需要移动的存储过程或视图。
$xfr1 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Transfer($prodServerDB.Databases[$devDatabase])
#Set this objects properties
$xfr1.DestinationLoginSecure = $false
$xfr1.DestinationServer = $devServer
$xfr1.DestinationLogin = $devUsername
$xfr1.DestinationPassword = $devPassword
$xfr1.DestinationDatabase = $devDatabase
$xfr1.BatchSize = 10485760
$xfr1.CopyData = $true
$xfr1.CopyAllTables = $true
$xfr1.CopyAllObjects = $true
$xfr1.CopyAllDatabaseTriggers = $true
$xfr1.CopyAllLogins = $false
$xfr1.CopyAllRoles = $false
$xfr1.CopyAllUsers = $false
$xfr1.CopySchema = $true
$xfr1.PreserveDbo = $true
$xfr1.PreserveLogins = $true
$xfr1.Options.AllowSystemObjects = $false
$xfr1.Options.ContinueScriptingOnError = $true
$xfr1.Options.Indexes = $true
$xfr1.Options.IncludeIfNotExists = $true
$xfr1.Options.DriAll = $true
$xfr1.Options.SchemaQualify = $true
$xfr1.Options.ScriptSchema = …Run Code Online (Sandbox Code Playgroud) 下面的查询用于创建一个带有服务器名称列表的文本文件。
我遇到的问题是文本文件的创建就像
Server, Server, Server etc.
Run Code Online (Sandbox Code Playgroud)
但我需要它如下
Server
Server
Server
Run Code Online (Sandbox Code Playgroud)
查询:
BEGIN
CREATE TABLE [TempPSWmiObjectQuery]
(QueryText nvarchar(max))
END
INSERT INTO [TempPSWmiObjectQuery]
SELECT STUFF((SELECT char(13)+char(10),
SUBSTRING(ServerName, 1,
CASE WHEN CHARINDEX(',', ServerName) > 0
THEN CHARINDEX(',', ServerName)-1
ELSE LEN(ServerName)
END)
FROM MasterList
FOR XML PATH('')), 1, 1, '')
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE
EXEC xp_cmdshell 'bcp SQLEnv.dbo.TempPSWmiObjectQuery out "\\ServerName\Data\temp\testlist.txt" -c -T -S "ServerName\Instance"'
EXEC sp_configure 'xp_cmdshell', 0;
RECONFIGURE
DROP TABLE TempPSWmiObjectQuery
Run Code Online (Sandbox Code Playgroud)
PowerShell 脚本:
$StagingServer = "ServerName\InstanceName"
$StagingServerDatabase = "SQLEnv"
foreach($line in
[System.IO.File]::ReadLines("\\ServerName\Data\temp\testlist.txt")) …Run Code Online (Sandbox Code Playgroud) sql-server-2008 sql-server powershell sql-server-2008-r2 sql-server-2012
我正在考虑通过 PowerShell 或任何其他方式设置一个自动化流程,以便在 SQL Server 主机上的磁盘利用率达到 90% 时截断 SQL Server 事务日志文件。
有人有可以做到这一点的代码吗?任何帮助将不胜感激!
注意:我知道这不好,但它仅适用于日志文件
我有一个脚本来获取当前正在运行的作业:
-- get the running jobs
--marcelo miorelli
-- 10-dec-2013
SELECT sj.name
,DATEDIFF(SECOND,aj.start_execution_date,GetDate()) AS Seconds
FROM msdb..sysjobactivity aj
JOIN msdb..sysjobs sj on sj.job_id = aj.job_id
WHERE aj.stop_execution_date IS NULL -- job hasn't stopped running
AND aj.start_execution_date IS NOT NULL -- job is currently running
--AND sj.name = 'JobName'
and not exists( -- make sure this is the most recent run
select 1
from msdb..sysjobactivity new
where new.job_id = aj.job_id
and new.start_execution_date > aj.start_execution_date )
Run Code Online (Sandbox Code Playgroud)
当我在我的服务器上运行它时,它说当前没有正在运行的作业,但是,当我查看作业活动监视器时,我看到了下图。
此作业的第二步是使用代理运行 powershell 脚本。 你可以在这里看到第二步。 …
sql-server powershell sql-server-2012 jobs maintenance-plans
我使用的是 SQL Server 2005。我的一个备份驱动器已满,所以我想移动 2 天之前的备份。
我正在考虑创建一个每天运行的作业,但卡在了移动.bak文件的脚本上。
您知道从驱动器 A 移动文件并将其移动到共享位置的脚本吗?我的.bak文件没有时间戳。
我的本地机器中有一个脚本文件。我必须打开 SSMS 并在 SSMS 中打开查询并执行查询。
为了打开 SSMS 和查询,我使用了以下 PowerShell 脚本来完成它。
ssms.exe 'E:\PowerShell_PROD\Screenshot\ServerDetails.sql' -E -S localhost
Run Code Online (Sandbox Code Playgroud)
如何使用 PowerShell 运行此查询以及如何关闭此查询窗口?
我这样做的原因是我必须获取 SQL Server 属性和其他信息的证据。为此,我有一个 PowerShell 脚本来捕获屏幕截图。
我正在准备 PowerShell 脚本,该脚本在 SSMS 中运行每个查询并捕获结果并保存到指定路径。现在可以在 SSMS 中打开查询并捕获屏幕截图,但我无法运行查询。
我有一个使用SqlRestoreAsync方法恢复数据库的 Powershell 脚本。
我有一个大小适中的数据库,我正在恢复(~55Gb),我正在尝试查找恢复过程的进度。
我知道,如果我通过 T-SQL 命令运行恢复,那么我可以通过查询一些 DMV 或使用以下查询来查看恢复的进度:
SELECT r.session_id
, r.command
, CONVERT(NUMERIC(6, 2), r.percent_complete) AS [Percent Complete]
, CONVERT(VARCHAR(20), DATEADD(ms, r.estimated_completion_time, GetDate()), 20) AS [ETA Completion Time]
, CONVERT(NUMERIC(10, 2), r.total_elapsed_time / 1000.0 / 60.0) AS [Elapsed Min]
, CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0) AS [ETA Min]
, CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0 / 60.0) AS [ETA Hours]
, CONVERT(VARCHAR(1000), (
SELECT SUBSTRING(TEXT, r.statement_start_offset / 2, CASE
WHEN r.statement_end_offset …Run Code Online (Sandbox Code Playgroud) 我一直在尝试在我的 AG 环境中获取 RegisterAllProvidersIP 的参数值。但是,该命令并未获取所有结果。结果集只有 4 个参数,我想知道如何获取所有参数。我想检查一下以调查持续的连接问题。这是多子网 AlwaysOn 配置。
我正在使用以下命令:
Get-Clusterresource -Name AG_Name | Get-ClusterParameter
AG_Name 是侦听器名称。
请帮助确定我做错了什么,还是只是一些权限问题?
我对 SQL Server 很陌生。我有一个脚本,它在所有数据库中查找孤立用户并生成脚本以删除或映射用户以正确登录(如果可用)。
由于我想在大量服务器上运行该脚本,所以我想到了使用 PowerShell 来帮助我。但我现在有两个问题:
问题 1:以下脚本本身返回输出,但仍显示一些错误。我试图调试,但我无法这样做。
DECLARE @orphan_users TABLE (
Server NVARCHAR(MAX),
DBName sysname,
[user_name] sysname,
type_desc nvarchar(60),
default_schema_name sysname NULL,
create_date datetime,
modify_date DATETIME,
[sid] VARBINARY(85),
cr_type int
);
INSERT INTO @orphan_users (Server,
DBname,
[user_name],
type_desc,
default_schema_name,
create_date,
modify_date,
[sid],
cr_type
)
EXEC sp_msforeachdb
'use [?]
SELECT
@@SERVERNAME
,DB_NAME() DBname
,name
,type_desc
,default_schema_name
,create_date
,modify_date
,[sid]
,Datalength(sid) AA
from sys.database_principals
where type in (''S'')
and [sid] not in ( select [sid] from …Run Code Online (Sandbox Code Playgroud)