使用单个 PowerShell 脚本安装多个 SQL 脚本





4.00/5 (1投票)
使用单个 PowerShell 脚本安装多个 SQL 脚本。
引言
这个 PowerShell 脚本演示了如何从源文件读取需要处理的 SQL 文件。每个 SQL 脚本将被读取并针对 MS SQL 服务器执行。每个 SQL 脚本可以包含多个批处理的 SQL 命令。每个批处理将被单独处理。
使用代码
该解决方案至少包含三个文件
- InstallSQLScript_PS3.ps1
- InstallSQLScripts.txt
- InstallSQLScripts 中提到的 .SQL 文件
.SQL 文件应包含 drop、create、insert、update 或 delete 指令。在 .SQL 脚本中,可以将消息从 SQL 服务器发送回 PowerShell 脚本。这可以通过在 .SQL 文件中使用以下命令来完成。
实际的 PowerShell 脚本。请注意,此脚本在 PowerShell 3 下运行。
此文件包含需要处理的所有 SQL 文件的列表。处理是使用自上而下的方法完成的。可以通过在行首放置 # 来添加注释。空行将被忽略。
注意:此文件必须放置在与 SQL 文件存储的文件夹相同的文件夹中。
PRINT 'TABEL PAYMENT_TYPE DROPPED'
在 SQL 文件中,可以通过使用 GO 命令分隔批处理来定义 SQL 批处理
USE [DB-NAME]
SET ANSI_NULLS ON
GO
SET NOCOUNT ON
GO
设置
步骤 1:配置 PowerShell 脚本变量
在 InstallSQLScripts_PS3.ps1 中,需要修改函数 Initialize
以反映您的环境。
# Initialize the Script variables
function Initialize
{
$Script:SQl_File_Location = "<SqlFileLocationPath>";
$Script:SQLInstallList = "InstallSQLScriptsList.txt";
$Script:ConnectionString ="Server={0};database=<DB_NAME>;user id={1};password={2};Trusted_Connection={3}";
$Script:LogFile = [string]::Format("<LogFileLocationPath>\InstallLogFile{0:yyyy_MM_dd}.Log", [DateTime]::Now);
$Script:HtmlLogFile = [string]::Format("<LogFileLocationPath>\\InstallLogFile{0:yyyy_MM_dd}.html", [DateTime]::Now);
$script:SqlInstance ="ServerName\InstanceName";
$Script:InstalledListSB = New-Object System.Text.StringBuilder;
Create-HtmlHeader
$Script:SMTPServer = "SMTP-Server";
$Script:FromSender ="<a href="mailto:InstallSqlScript@SMTP-SERVERDOMAIN">InstallSqlScript@SMTP-SERVERDOMAIN</a>";
# Use ; to separate multiple email recipients
$script:ToRecipient ="<a href="mailto:Recipient1@email.addr;Recipient2@email.addr">Recipient1@email.addr;Recipient2@email.addr</a>";
$script:Subject = "Script Installation";
#Track whether a script error occurred or not
$script:ErrorHasOccured = $false;
$script:ScriptHadError = $false;
}
需要将以下变量设置为适当的值
- SQl_File_Location
将 <SqlFileLocationPath> 替换为将保存 SQL 文件和 InstallSqlScriptsList.txt 文件的文件夹的实际 (UNC) 路径。
- ConnectionString
将 DB_NAME 设置为适当的数据库名称。
- LogFile
将 <LogFileLocationPath> 替换为应存储日志文件的实际 (UNC) 路径。
- HtmlLogFile
将 <LogFileLocationPath> 替换为应存储 HTML 格式日志文件的实际 (UNC) 路径。如果无法发送电子邮件消息,则将执行此操作。
- SqlInstance
将 ServerName\InstanceName 替换为数据库服务器的实际 ServerName\Instance 名称。
- SMTPServer
接受中继的 SMTP 服务器名称。
- FromSender
将在 FROM 部分中显示的电子邮件地址。
- ToRecipent
收件人的电子邮件地址列表。在不同的电子邮件地址之间放置分号。或者只提供一个电子邮件地址。
步骤 2:设置 PowerShell ExecutionPolicy
需要在将执行此 PowerShell 脚本的计算机上设置 PowerShell 执行策略。默认情况下,执行策略设置为 restricted。这会禁止执行任何 PowerShell 脚本。
可以通过 PowerShell 的 Set-ExecutionPolicy 命令修改此限制。另请参阅 PowerShell 帮助:Get-Help Set-ExecutionPolicy。理想情况下,应该使用已签名的脚本,但如果脚本将进行修订,则可以使用不受限制的执行策略。请注意,此不受限制的策略设置可能会对运行 PowerShell 脚本的计算机构成安全风险。
步骤 3:测试设置
现在一切都已设置好,在 PowerShell ISE 环境中打开 PowerShell 脚本并运行该脚本。如果一切设置正确,脚本将执行 SQL 脚本并发送一封带有脚本结果日志的电子邮件消息。如果脚本无法发送电子邮件,则应在分配给 HtmlLogFile 变量的文件夹中找到 HTML 日志文件。
步骤 4:安排任务
为了将 PowerShell 脚本作为计划任务运行,需要通过以下命令行命令调用该脚本
powershell.exe -NoProfile -NonInteractive -File "\\path\InstallSQLScripts_PS3.ps1"
关注点
PowerShell 的默认执行策略受到限制。这意味着即使是自己编写的 PowerShell 脚本也只能以交互方式执行。
并非所有 .NET 方法都在 PowerShell 中可用。例如,在 PowerShell 1 和 2 下,System.Net.Mail.SmtpClient 不具有 .Dispose() 方法;此方法在 PowerShell 3 中可用。
在 PowerShell 3 中,可以执行以下操作
$SplitChars = @("\r","\n"); $HelpText = $TmpText.Split($SplitChars, [System.StringSplitOptions]::RemoveEmptyEntries);
以上操作无法在 PowerShell 2 下完成。您需要在那里循环 $TmpText 并处理空行。