使用 Sql Server 2012,有人可以向我展示一个简单的 powershell 3 脚本来生成我的整个数据库(架构和数据)吗?
我试过这个:
$Filepath='d:\b\t' # local directory to save build-scripts to
$DataSource='HH' # server name and instance
$Database='HMovies'# the database to copy from
# set "Option Explicit" to catch subtle errors
set-psdebug -strict
$ErrorActionPreference = "stop" # you can opt to stagger on, bleeding, if an error occurs
# Load SMO assembly, and if we're running SQL 2008 DLLs load the SMOExtended and SQLWMIManagement libraries
$ms='Microsoft.SqlServer'
$v = [System.Reflection.Assembly]::LoadWithPartialName( "$ms.SMO")
if ((($v.FullName.Split(','))[1].Split('='))[1].Split('.')[0] -ne '9') { …Run Code Online (Sandbox Code Playgroud) 在 SSMS 中,如果您要连接到设置为 1433 以外的特定端口的 SQL Server 实例,您只需在实例名称后加上“,端口号”。同样,如果我正在使用System.Data.SqlClient.SqlConnection并希望使用 填充数据集System.Data.DataSet,我会在指定连接字符串的数据源部分以传递到该对象时执行相同的操作。
有没有办法使用Microsoft.SqlServer.Management.Smo.Server类来做到这一点?
我尝试了一些没有运气的变化,例如:
$cnString = "Data Source=Server\instance,port;Initial Catalog=master;Trusted_Connection=true;"
$cn = new-object system.data.sqlclient.sqlconnection($cnstring)
$cnSql = New-Object Microsoft.sqlserver.management.common.serverconnection($cn)
$s = New-Object Microsoft.sqlserver.management.smo.server($cnSql)
$s | Select Name, Version
Run Code Online (Sandbox Code Playgroud)
或者只是尝试:
$s = New-Object Microsoft.sqlserver.management.smo.server "Server\Instance,port"
$s | Select Name, Version
Run Code Online (Sandbox Code Playgroud) 我需要一个 power-shell 脚本来获取以下信息 数据库名称、数据库的 LastBackupDate 并且这些信息应该通过电子邮件发送,将结果转换为 HTML 格式:) 如果我们有机会完成脚本,这将是 .ps1 文件我需要知道如何作为 sql 作业运行。
我使用 PowerShell 脚本将多个 SQL Server 作业部署到一组服务器。我可以创建作业步骤、成功失败操作,甚至是输出文件。这一切都适用于多台服务器。我无法确定的是如何指定将输出文件附加到而不是覆盖。
以下是我的主脚本部分。$Job在上一步中填充。
$JobStep = new-object ('Microsoft.SqlServer.Management.Smo.Agent.JobStep') ($Job, 'MyJobStepName')
$JobStep.ID = 1
$JobStep.SubSystem = 'PowerShell'
$Command = 'dir d:\'
$JobStep.Command = $Command
$JobStep.OnSuccessAction = 'GotoNextStep'
$JobStep.OnFailAction = 'GotoNextStep'
$JobStep.OutputFileName = 'D:\MyJobFile.txt'
$JobStep.Create()
Run Code Online (Sandbox Code Playgroud)
我一直在使用这个 MSDN页面作为参考。
我使用 SQL Server Management Studio 修改了其中一个步骤并跟踪了结果。这看起来很有希望。创建作业步骤后,我可以发出 SQL 命令。
EXEC msdb.dbo.sp_update_jobstep @job_id=N'12156dcb-c8cd-4267-901a-55175dd44960', @step_id=1 ,
@flags=2
Run Code Online (Sandbox Code Playgroud) 我编写了一个脚本,该脚本以数据库名称、恢复的数据库名称、备份源、数据文件位置和日志文件位置为参数,并在 SQL Server 实例上执行数据库恢复。当从 PowerShell ISE 运行时,脚本工作正常,但是当从 PowerShell 控制台运行时,它会抛出缺少程序集错误,或者当以 CmdExec 或 PowerShell 类型通过 SQL 代理作业运行时出现错误时,术语未被识别为 cmdle 的名称。
我试图在脚本中使用 Add-Type 添加程序集的路径,但没有名为 Microsoft.SqlServer.Management.Smo.Server、Microsoft.SqlServer.Management.Smo.Restore... 等的程序集。
作为 PS newb,我没有想法。任何建议,如何解决这个问题以便能够在 SQL 代理作业步骤中运行这个脚本?
我正在使用命令在 ISE 和控制台中执行脚本
.\RestoreDB_Script.ps1 -DatabaseName TestDB -NewDatabaseName TestDB_new -SourceDir V:\Backup -DataDir D:\Data -LogDir L:\Log
Run Code Online (Sandbox Code Playgroud)
在 SQL 代理作业中执行脚本
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -Command C:\Script\RestoreDB_Script.ps1 -DatabaseName TestDB -NewDatabaseName TestDB_new -SourceDir V:\Backup -DataDir D:\Data -LogDir L:\Log
Run Code Online (Sandbox Code Playgroud)
脚本
Param(
[parameter(Mandatory=$true)]
[String]
$DatabaseName,
[parameter(Mandatory=$true)]
[String]
$NewDatabaseName,
[parameter(Mandatory=$true)]
[String]
$SourceDir,
[parameter(Mandatory=$true)]
[String]
$DataDir,
[parameter(Mandatory=$true)]
[String]
$LogDir)
$file = $DatabaseName+".bak" …Run Code Online (Sandbox Code Playgroud) powershell smo sql-server-agent windows-server sql-server-2016
我目前正在构建一个流程,Powershell在该流程中,我们SQL Server Agent只需输入服务器名称即可将作业从一台服务器复制到另一台服务器。该脚本使用 SMO 库来获取对两个作业服务器的访问权限,为“其他”服务器上不存在的作业编写脚本,然后运行这些脚本(在 SqlConnection 和 SqlCommand 下)。问题是如何检查ServerOne与ServerTwo.
我尝试了四种不同的方法:使用来自 ServerTwo(比较服务器)的作业构建一个数组,然后查看该数组是否是contains来自 ServerOne 的作业;我也尝试过类似逻辑的操作符;并且,使用数组,我在Compare-Object从两台服务器加载两个带有作业名称的数组并测量另一个不存在的作业(也产生所有内容)之后使用。最后,我遍历 ServerTwo 上的每个作业并遍历 ServerOne 上的每个作业,看看它们是否彼此相等(这是下面的代码)。这将产生一切,因为每个工作不等于每个工作:
$ServerName = "S1\I"
$ComServer = "S2\I"
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $ServerName
$com = New-Object "Microsoft.SqlServer.Management.Smo.Server" $ComServer
foreach ($a in $com.JobServer.Jobs)
{
$a = $a.Name.ToString()
foreach ($j in $srv.JobServer.Jobs)
{
$j = $j.Name.ToString()
if ($a -like $j)
{
Write-Host $j
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否有另一种方法可以检查作业是否存在于一台服务器上与另一台服务器上(请注意,我已经知道如何编写作业脚本,执行它等等;确保作业不存在的部分已经存在是这里的问题)?
我很懒惰,宁愿参数化一次(以获得名称的 object_id)并Invoke-SqlCmd用于其余工作。
给定一系列用于处理任意服务器对象的函数,下面的测试是否足以确认 CmdletBinding 输入参数Int32防止通过用户提供的方式注入$object_id?
function foo {
[CmdletBinding()]Param(
[Int32]$object_id
)
$query = "select type_desc from sys.objects where object_id = $object_id;"
Invoke-Sqlcmd -ServerInstance "localhost" -Database "tempdb" -Query $query
}
foo 3
foo "0 union all select name from sys.syslogins where sid = 0x01"
foo $null
foo ([math]::Pow(2,31)+1)
foo @(1,2)
Run Code Online (Sandbox Code Playgroud) 我按照https://dbatools.io/offline/ 上的说明进行操作:
下载压缩包并解压
运行$env:PSModulePath以查找所有路径。
复制到C:\Program Files\WindowsPowerShell\Modules.
跑 Get-ChildItem -Recurse "C:\Program Files\WindowsPowerShell\Modules" | Unblock-File
当我尝试运行时Export-DbaInstance -SqlInstance,出现以下错误:
术语 Export-DBAInstance 无法识别”。
任何帮助将不胜感激。
我有几台服务器,我在 sql server 服务上看到一个蓝色的问号,如下图所示。
启用这些 Windows 防火墙规则对我有用
Windows 管理规范 (WMI-In)
Windows 管理规范 (DCOM-In)
有没有办法通过powershell实现这一目标?
sql-server powershell windows-server connectivity sql-server-2014
我发现写入输出行(打印出变量)的格式似乎不一致。我找不到任何有关此的信息,这让我猜测我误解了我所看到的内容。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- =-=-=-=
陈述:
对于大多数简单的变量,以下内容将起作用:
Write-Output " This $testValue will print just fine."
Run Code Online (Sandbox Code Playgroud)
但是,如果变量是对象的一部分,我需要将 $() 添加到 Write-Output 行:
Write-Output $("Removing old software from directory: " + $site.INSTALLDIR)
Run Code Online (Sandbox Code Playgroud)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- =-=-=-=
问:上述说法正确吗?