MSSQL脚本自动生成与发布实践

1. 概述

MSSQL脚本自动生成与发布是一种自动化的方法,它可以减少手动操作的错误和时间,提高效率和一致性。在本文中,我们将介绍如何建立一个基础架构来实现MSSQL脚本自动生成和发布流程。

2. 准备工作

2.1 创建数据库

首先要为我们的脚本创建一个数据库。为此,我们需要在MSSQL Server Management Studio中执行以下脚本:

CREATE DATABASE ScriptDB;

GO

2.2 创建目录结构

为了容易管理,我们将在文件系统中创建以下目录结构:

C:\

|

+--Scripts\

| |

| +--Production\

| | |

| | +--Tables\

| | |

| | +--StoredProcedures\

| | |

| | +--Views\

| |

| +--QA\

| | |

| | +--Tables\

| | |

| | +--StoredProcedures\

| | +--Views\

| |

| +--Dev\

|

+--Tables\

+--StoredProcedures\

+--Views\

按照上述目录结构,我们可以将产生的SQL脚本归类到具有不同用途的子目录中。例如,根据目录结构,存储过程应该放在“StoredProcedures”子目录下,视图和表应该相应地放在“Views”和“Tables”子目录下。

2.3 创建源代码版本控制仓库

使用源代码管理工具(Git)创建单独的版本控制仓库(ScriptDB)来管理我们的所有SQL脚本。

3. 使用PowerShell发布脚本

3.1 安装PowerShell脚本

要使用PowerShell自动化发布脚本,我们需要安装SqlServer模块。有以下几种方法安装。

安装方式一:

Install-Module -Name SqlServer -AllowClobber

安装方式二:

go to the link: https://docs.microsoft.com/en-us/sql/powershell/download-sql-server-ps-module?view=sql-server-ver15

3.2 实现PowerShell脚本

我们将得到自动化脚本的基础架构,下面我们将实现PowerShell脚本。

3.2.1 脚本变量定义

在使用PowerShell和SqlServer模块之前,我们需要定义以下变量:

$ServerName = 'localhost'

$DatabaseName = 'ScriptDB'

$ScriptPath = 'C:\Scripts\Production'

变量$ServerName和$DatabaseName分别用于指定连接到哪个MSSQL数据库。变量$ScriptPath用于指定要发布的脚本的路径。变量$ScriptPath指向“Production”子目录,其中包含与生产环境相关的脚本。

3.2.2 建立目录连接

PowerShell脚本将连接到ScriptDB Git存储库并检查有关目录的信息,这可以通过以下命令来完成:

$SecurePassword = ConvertTo-SecureString "$PwdChars" -AsPlainText -Force

$Credentials = New-Object System.Management.Automation.PSCredential ("Git用户名",$SecurePassword)

git config --global credential.helper store

Set-Location $ScriptPath

$branch = Get-ChildItem -Path $ScriptPath | Where-Object {$_.PSIsContainer -eq $true} | Select-Object -Last 1

$dataSyncBranch = $branch.FullName.Replace($ScriptPath, "")

$dataSyncBranch

第一行是一个命令,它将从控制台获取密码并将其转换为安全字符串。第二行创建PS凭据对象。之后是Git用户凭据(用户名和密码)。在第三行中,我们将确保访问Git存储库不用手动输入凭据。第四行设置ScriptDB Git存储库的位置。接下来,我们从子目录列表中选出最后一个目录,作为我们的主分支。在最后一行,我们为数据同步存储库设置了$ dataSyncBranch变量,该变量仅是最后一个子目录的名称。

3.2.3 数据库对象枚举

现在,脚本将从指定的数据存储库中获取表,存储过程和视图的信息。以下是此操作的代码:

$conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=$ServerName;Initial Catalog=$DatabaseName;Integrated Security=True")

$command = New-Object System.Data.SqlClient.SqlCommand

$command.Connection = $conn

$conn.Open()

$Tables = @()

$command.CommandText = @"

SELECT TABLE_SCHEMA, TABLE_NAME

FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA NOT IN ('sys', 'Information_schema')

"@

$reader = $command.ExecuteReader()

while ($reader.Read()) {

$obj = New-Object PSObject

$obj | Add-Member -MemberType NoteProperty -Name SchemaName -Value $reader[0]

$obj | Add-Member -MemberType NoteProperty -Name ObjectName -Value $reader[1]

$Tables += $obj

}

$reader.Close()

$Procedures = @()

$command.CommandText = @"

SELECT ROUTINE_SCHEMA, ROUTINE_NAME

FROM INFORMATION_SCHEMA.ROUTINES

WHERE ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')

"@

$reader = $command.ExecuteReader()

while ($reader.Read()) {

$obj = New-Object PSObject

$obj | Add-Member -MemberType NoteProperty -Name SchemaName -Value $reader[0]

$obj | Add-Member -MemberType NoteProperty -Name ObjectName -Value $reader[1]

$Procedures += $obj

}

$reader.Close()

$Views = @()

$command.CommandText = @"

SELECT TABLE_SCHEMA, TABLE_NAME

FROM INFORMATION_SCHEMA.VIEWS

WHERE TABLE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')

"@

$reader = $command.ExecuteReader()

while ($reader.Read()) {

$obj = New-Object PSObject

$obj | Add-Member -MemberType NoteProperty -Name SchemaName -Value $reader[0]

$obj | Add-Member -MemberType NoteProperty -Name ObjectName -Value $reader[1]

$Views += $obj

}

$reader.Close()

$conn.Close()

在此代码段中,我们连接到指定的数据库,然后使用多个SQL查询枚举三种数据库对象:表,存储过程和视图。每个对象都将包含对象的架构和名称,以便稍后使用。

3.2.4 进行自动部署

现在,我们将使用Git来部署生产环境的脚本。以下是脚本实现的代码:

$branchName = "deploy/" + (Get-Date -Format 'yyyy-MM-dd_HH-mm-ss')

$commitMessage = "Deploy changes " + (Get-Date -Format 'yyyy-MM-dd HH:mm:ss')

git checkout $dataSyncBranch

git checkout -b $branchName

$Tables | ForEach-Object {

$script = Get-Content "$ScriptPath\Production\tables\$($_.ObjectName).sql"

$script | Out-File deploy.sql

git add deploy.sql

git commit -m "Deploy $_.ObjectName"

}

$Procedures | ForEach-Object {

$script = Get-Content "$ScriptPath\Production\storedprocedures\$($_.ObjectName).sql"

$script | Out-File deploy.sql

git add deploy.sql

git commit -m "Deploy $_.ObjectName"

}

$Views | ForEach-Object {

$script = Get-Content "$ScriptPath\Production\views\$($_.ObjectName).sql"

$script | Out-File deploy.sql

git add deploy.sql

git commit -m "Deploy $_.ObjectName"

}

git push origin $branchName

git checkout $dataSyncBranch

在此代码段中,我们将生产环境的脚本发布到Git仓库中。特别是,该脚本将连接到ScriptDB存储库,检查表,存储过程和视图的列表,然后将该列表中的所有对象的脚本提交为单独的Git提交。提交后,我们将$branchName变量设置为包含当前日期和时间的字符串。然后,我们将所有SQL脚本推送到Git,然后切换回master分支。

4. 结论

在本文中,我们介绍了如何使用PowerShell和SqlServer模块自动化MSSQL脚本发布流程。我们创建了一个基础架构,并使用PowerShell创建了一个脚本,以自动发布生产环境的SQL脚本。我们还建议使用源代码管理工具存储MSSQL脚本,并为此创建单独的数据同步存储库。

数据库标签