目標
2つのデータベースの同期を維持することは、SQLデータベースの開発と保守に取り組むときによく遭遇するタスクです。 1つの特定のケースはこれです。テストおよび開発環境に存在するデータベースのバージョンは、テストが最新バージョンで実行されていることを確認するために一貫して同期する必要があります。これは、データベースの開発バージョンでスキーマの変更を検出し、それらをテスト環境のバージョンとスケジュールに従って自動的に同期することによって実行する必要があります。
それを達成する方法
スキーマ比較ツールをPowerShellスクリプトおよびスケジューリングと組み合わせることにより、2つのSQLデータベースの自動同期を実現する方法を検討します。
これから説明する例では、データベースは15分ごとに同期されます。スキーマ比較ツールを使用しているため、データベースの開発バージョンとテストバージョンの間に実際の変更があった場合にのみデータベースが更新されることを確認できます。これにより、不要なリソースを大量に消費する操作の実行が防止されます。
SQL Serverデータベースの差分と同期を行うためのユーティリティとして、DevartSchemaCompareを使用します。これは、ライブSQL Serverデータベース、スナップショット、およびバックアップを比較および同期できるツールです。以下でプロジェクトを実装する方法を見てみましょう。
セットアップ
まず、いくつか設定する必要があります:
- スキーマ比較の実行
- ‘新しいスキーマの比較をクリックします ‘ ツールバーのボタン、またはスタートページの右上にあるボタン:
- ソースとターゲット 新しいスキーマ比較のタブ ウィンドウで、目的のソースデータベースとターゲットデータベースを選択します。
- オプション 、スキーママッピング 、およびテーブルマッピング タブでは、必要な比較および同期オプションを設定できます。
- すべての設定が完了したら、‘比較を押すことができます ‘ 右下隅にあるボタンをクリックして、比較プロセスを開始します。
- 比較が終了すると、比較されたすべてのオブジェクトとそれぞれの違いのステータスがウィンドウの上部に表示され、それらの各オブジェクトの詳細なスクリプトが下部に表示されます。
- すべてのオブジェクトをチェックして同期プロセスに含め、‘保存をクリックします ‘ ボタンをクリックするか、ファイル>保存を押します :
これにより、同期プロセスを開始するために必要なすべての情報がプロジェクトに保存されます。 - プロジェクトが保存されたら、[オブジェクトの同期]をクリックします ' ボタン:
- スキーマ同期ウィザード オープンします。まず、[ターゲットデータベースに対して直接スクリプトを実行する]を選択します。 ‘出力 タブ:
- オプションで必要な設定を選択できます タブ:
- 概要で同期されるすべてのオブジェクトを確認できます タブ:
- 「同期」をクリックします ‘ 同期プロセスをテストするには、右下隅にあります。
- ウィンドウの下部ペインに結果が表示されます。
プロセスの自動化
スキーマの同期が成功し、必要なすべての情報を含むプロジェクトファイルができたので、PowerShellスクリプトを使用して同期プロセスを自動化しましょう。
次の例では、統合セキュリティを使用していると想定していますが、保存および暗号化されたデータベースには、リポジトリのクレデンシャルとともにプロジェクトファイルから簡単にアクセスできます。
特に興味深いスクリプト作成プロセスの一部を見ていきますが、完成したスクリプトをすぐにダウンロードしてテストするには、このセクションをスキップしてください。
スクリプトの作成
まず、Outputsフォルダーが存在するかどうかを確認する関数を作成する必要があります。このフォルダの目的は、データがスタンプされたコミットの概要を保存することです。関数は次のようになります:
#check if the Outputs folder exists
function CheckAndCreateFolder($rootFolder, [switch]$Outputs)
{
$location = $rootFolder
#setting up its location
if($Outputs -eq $true)
{
$location += "\Outputs"
}
#creating the folder if it doesn't currently exist
if(-not (Test-Path $location))
{ mkdir $location -Force:$true -Confirm:$false | Out-Null }
return $location
} 次に、ルートフォルダとスキーマ出力の概要の場所を定義します。
#defining the root folder for the synchronization process $rootFolder = "d:\temp\SchemaSync" #defining the location of schema output summaries $outsLoc = CheckAndCreateFolder $rootFolder -Outputs
次に、Schema Compareの場所、日付スタンプ変数、およびアプリケーションのパラメーターを定義する必要があります。
#Schema Compare location and the date stamp variable are defined, as well as the tool’s parameters $diffLoc = "C:\Program Files\Devart\dbForge Studio for SQL Server\dbforgesql.com" $stamp = (Get-Date -Format "Mmddyyyy_HHMMss")
これが適切な場所にあると、出力ログファイルへのパスを設定できます。
#output log file path $logPath = "$outsLoc\SchemaOutput_$stamp.txt" $Params = "/schemacompare /compfile:""D:\temp\SchemaSync\Project\AdventureWorksLTDvsAdventureWorksDW.scomp"" /log:""$logPath""" $sync = " /sync"
次に、Schema Compareを呼び出して、同期パラメータを実行させます。
#initiate the schema comparison and synchronization process
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params))
$returnCode = $LASTEXITCODE
$message = "" スクリプトの最後の部分は、考えられるすべての結果を定義するのに役立ちます。
- スキームの変更が検出されました。リターンコード0–成功
- スキーマの変更は検出されませんでした。リターンコード100–スキーマの変更は検出されませんでした
- エラーが発生したため、出力の概要が開きます。
if ($returnCode -notin (100, 101))
{ #an error is encountered
$logPath = "$outsLoc\SchemaOutput_error.txt"
$message >> $logPath
clear-content $logPath
$message = "`r`n $returnCode - An error is encountered"
#output file is opened when an error is encountered
Invoke-Item "$logPath"
}
else{
if ($returnCode -eq 101)
{
clear-content $logPath
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params+$sync))
$returnCode = $LASTEXITCODE
#schema changes are detected
}
if($returnCode -eq 0)
{
$message = "`r`n $returnCode - Schema changes were successfully synchronized"
}
else
{
#there are no schema changes
if($returnCode -eq 100)
{
$message = "`r`n $returnCode - There are no schema changes. Job aborted"
}
}
}
$message >> $logPath スケジュール
PowerShellスクリプトの準備が整い、プロセスが自動化されたので、これをいくつかの異なる方法でスケジュールできます。 Windowsスケジューラ経由。
結果の表示
スケジュールされたジョブが稼働しているので、必要なときにいつでもスキーマ出力の要約を表示できます。先ほど見た例では、$outsLoc変数がスキーマ出力の要約の場所を定義しました。その結果、そのような要約は$ rootFolder \ $ outsLocに保存されます–この特定の場合、SchemaSync \ Outputs:
エラーが発生した場合、例:プロジェクトファイルの拡張子が正しく入力されていない場合、対応するエラーメッセージが出力の概要に表示されます。
戻りエラーコードのリストは、発生した特定のエラーをよりよく理解するのに役立ちます。
[タイトルを展開=”フルスクリプト 「]
#check if the Outputs folder exists
function CheckAndCreateFolder($rootFolder, [switch]$Outputs)
{
$location = $rootFolder
#setting up its location
if($Outputs -eq $true)
{
$location += "\Outputs"
}
#creating the folder if it doesn't currently exist
if(-not (Test-Path $location))
{ mkdir $location -Force:$true -Confirm:$false | Out-Null }
return $location
}
#defining the root folder for the synchronization process
$rootFolder = "d:\temp\SchemaSync"
#defining the location of schema output summaries
$outsLoc = CheckAndCreateFolder $rootFolder -Outputs
#Schema Compare location and the date stamp variable are defined, as well as the tool’s parameters
$diffLoc = "C:\Program Files\Devart\dbForge Studio for SQL Server\dbforgesql.com"
$stamp = (Get-Date -Format "Mmddyyyy_HHMMss")
#output log file path
$logPath = "$outsLoc\SchemaOutput_$stamp.txt"
$Params = "/schemacompare /compfile:""D:\temp\SchemaSync\Project\AdventureWorksLTDvsAdventureWorksDW.scomp"" /log:""$logPath"""
$sync = " /sync"
#initiate the schema comparison and synchronization process
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params))
$returnCode = $LASTEXITCODE
$message = ""
if ($returnCode -notin (100, 101))
{ #an error is encountered
$logPath = "$outsLoc\SchemaOutput_error.txt"
$message >> $logPath
clear-content $logPath
$message = "`r`n $returnCode - An error is encountered"
#output file is opened when an error is encountered
Invoke-Item "$logPath"
}
else{
if ($returnCode -eq 101)
{
clear-content $logPath
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params+$sync))
$returnCode = $LASTEXITCODE
#schema changes are detected
}
if($returnCode -eq 0)
{
$message = "`r`n $returnCode - Schema changes were successfully synchronized"
}
else
{
#there are no schema changes
if($returnCode -eq 100)
{
$message = "`r`n $returnCode - There are no schema changes. Job aborted"
}
}
}
$message >> $logPath [/エキスパンド]
この設定の過程で質問や問題が発生した場合は、example @ sqldat.comm
までいつでもお気軽にお問い合わせください。