65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2013 年 2 月 13 日

CPOL

3分钟阅读

viewsIcon

45978

downloadIcon

701

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

引言

这个 PowerShell 脚本演示了如何从源文件读取需要处理的 SQL 文件。每个 SQL 脚本将被读取并针对 MS SQL 服务器执行。每个 SQL 脚本可以包含多个批处理的 SQL 命令。每个批处理将被单独处理。

使用代码

该解决方案至少包含三个文件

  1. InstallSQLScript_PS3.ps1
  2. 实际的 PowerShell 脚本。请注意,此脚本在 PowerShell 3 下运行。

  3. InstallSQLScripts.txt
  4. 此文件包含需要处理的所有 SQL 文件的列表。处理是使用自上而下的方法完成的。可以通过在行首放置 # 来添加注释。空行将被忽略。

    注意:此文件必须放置在与 SQL 文件存储的文件夹相同的文件夹中。

  5. InstallSQLScripts 中提到的 .SQL 文件
    .SQL 文件应包含 drop、create、insert、update 或 delete 指令。在 .SQL 脚本中,可以将消息从 SQL 服务器发送回 PowerShell 脚本。这可以通过在 .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 并处理空行。

© . All rights reserved.