Theme NexT works best with JavaScript enabled

ShunNien's Blog

不積跬步,無以致千里;不積小流,無以成江海。

0%

使用 PowerShell 來產生 Database Schema Script

使用 PowerShell 來產生 database schema script

前一篇文章提到了 DAC ,但是遇到了 DAC 匯出失敗的問題,看訊息是部分資料表的因素,但是那些資料又是客戶自己的需求,所以利用 sqlserver 的產生 script 來進行結構備份紀錄,而自動化紀錄可以省時省力,此篇透過 PowerShell 來自動產生與處理

PowerShell ISE

要撰寫 PowerShell 可以透過 PowerShell ISE 這是一個方便撰寫的工具

powershell ISE

撰寫內容

首先簡單說明處理流程

  • 將會依使用者變動的部分設定為變數
  • 檢查目的地資料夾是否存在,並建立
  • 透過 SMO 建立連線
  • 匯出設定
  • 匯出結構

以下將程式與註解說明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# 最後儲存匯出結構的路徑資料夾
$Filepath = 'D:\MyScriptsDirectory'

# 資料庫連線的 data source
$DataSource = '127.0.0.1'

# 資料庫名稱
$Database = 'databaseName'

# 取得今天日期,後續會利用此日期當檔案名稱的一部份
$today = Get-Date -Format yyyy_MM_dd

# 防呆設計,當目的資料夾不存在時,建立資料夾
$homedir = "$Filepath\"
if (!(Test-Path -path $homedir)) {
Try { New-Item $homedir -type directory | out-null }
Catch [system.exception] {
Write-Error "error while creating '$homedir' $_"
return
}
}

# 開啟或關閉指令碼偵錯功能、設定追蹤層級和切換嚴格模式
set-psdebug -strict

# 可自訂 Windows PowerShell 行為的變數
$ErrorActionPreference = "stop"

# 讀取 SMO assembly, 假如使用 SQL 2008 DLLs 需要載入 SMOExtended 和 SQLWMIManagement libraries
$ms = 'Microsoft.SqlServer'
$v = [System.Reflection.Assembly]::LoadWithPartialName( "$ms.SMO")
if ((($v.FullName.Split(','))[1].Split('='))[1].Split('.')[0] -ne '9') {
[System.Reflection.Assembly]::LoadWithPartialName("$ms.SMOExtended") | out-null
}

$My = "$ms.Management.Smo" #

# 設定連線資訊
$mySrvConn = new-object Microsoft.SqlServer.Management.Common.ServerConnection
$mySrvConn.ServerInstance = "$DataSource"
$mySrvConn.MultipleActiveResultSets = $true
$mySrvConn.LoginSecure = $false
$mySrvConn.Login = "sa"
$mySrvConn.Password = "1qaz@WSX"
$mySrvConn.DatabaseName = "$Database"

$s = new-object ("$My.Server") $mySrvConn

# 進行連線
if ($s.Version -eq $null ) {Throw "Can't find the instance $Datasource"}
$db = $s.Databases[$Database]
if ($db.name -ne $Database) {Throw "Can't find the database '$Database' in $Datasource"};

$transfer = new-object ("$My.Transfer") $db

# 匯出設定
$CreationScriptOptions = new-object ("$My.ScriptingOptions")
# yes, we want these
$CreationScriptOptions.ExtendedProperties = $true
# and all the constraints
$CreationScriptOptions.DRIAll = $true
# Yup, these would be nice
$CreationScriptOptions.Indexes = $true
# This should be included when scripting a database
$CreationScriptOptions.Triggers = $true
# this only goes to the file
$CreationScriptOptions.ScriptBatchTerminator = $true
# of course
$CreationScriptOptions.IncludeHeaders = $true;
#no need of string output as well
$CreationScriptOptions.ToFileOnly = $true
# not necessary but it means the script can be more versatile
$CreationScriptOptions.IncludeIfNotExists = $true
$CreationScriptOptions.Filename = "$($FilePath)\$($Database)_$($today)_Build.sql";
$transfer = new-object ("$My.Transfer") $s.Databases[$Database]

# tell the transfer object of our preferences
$transfer.options = $CreationScriptOptions
$transfer.ScriptTransfer()
"All done"

這是按照 Automated Script-generation with Powershell and SMO 此篇文章的資料,重新調整撰寫的範本,目的是設定排程進行定期結構備份,後續還可以參考 Database Deployment: The Bits – Database Version Drift 進行備份比較等…

排程設定

排程設定主要是因為 .ps1 不像是 .bat 直接執行,所以需要透過 PowerShell 程式,再把撰寫的範本路徑設定到引數

schedule setting

參考資料

我的 GIST

powershell 學習資源

延伸閱讀

其餘工具

歡迎關注我的其它發布渠道