5

使用するPowershellスクリプトがありますinvoke-sqlcmd一連の開発データベースにスクリプトを適用します。スクリプトのリストをループしてデータベースの現在のリリース レベルと比較し、必要なスクリプトを適用して DB を必要なリリース レベルにします。特定のデータベースは参照データベースであり、READ_ONLY 状態にあります。これらのデータベースに接続し、DB スクリプトの変更を実行して READ_WRITE に設定し、スクリプトを適用してから、READ_ONLY に戻します。全体的にスクリプトはうまく機能します。問題は、PowerShell が最初にデータベースへの接続を開き、最初のスクリプトを適用してから、DB を READ_ONLY に戻してデータベースにオブジェクトがロックされているように見えることです。以前の接続と、以前のpowershell接続と思われるもののShared_Transaction_Workspaceロック(sys.dm_tran_locks)までさかのぼって追跡しました。invoke-sqlcmd完了しましたが、何かできることはありますか? invoke-sqlcmdコマンドレットを呼び出すたび に強制的に新しい接続を使用することはできますか?

問題のある接続を強制終了してから接続を再試行するという面倒な修正を試みましたが、もっと良い方法があると思います。

4

3 に答える 3

2

まあ、これは非常に古い投稿であり、Microsoft の人々がこの問題を修正したと言っていることは知っています (David Brabant が言及した記事によると)。 .

Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) を実行しても同じ問題が発生し、いくつかの調査を行った後、Invoke-Sqlcmd からいくつかのパラメーターを出力として取得する方法を得たので、現在のセッション ID を取得できます。 SQL Server から組み込みの @@SPID グローバル変数を使用してユーザー プロセスを実行し、ADO.NET と接続して KILL 句を実行し、開いている接続を閉じます。

それでは、私の場合に適用される回避策を見てみましょう

#Invoke the Invoke-Sqlcmd to execute an script from a file
Invoke-Sqlcmd -Server "[SERVER_NAME]" -Database [DATABASE_NAME] -Username [USER] -Password [PASSWORD] -InputFile [DOT_SQL_FILE_PATH]
#Invoke the Invoke-Sqlcmd to execute a inline SQL statement to get the SessionID as a Powershell variable
$SQLSession = Invoke-Sqlcmd -Server "[SERVER_NAME]" -Database [DATABASE_NAME] -Username [USER] -Password [PASSWORD] -query "select @@spid as SessionID"
# Build query to execute KILL clause
$DbQuery = "KILL " + $SQLSession.SessionID;

# Create SQL connection with ADO.NET
$DbConnection = New-Object System.Data.SqlClient.SqlConnection
$DbConnectionString = "Server = [SERVER_NAME]; Database = [DATABASE_NAME]; User ID=[USER]; Password=[PASSWORD];"
$DbConnection.ConnectionString = $DbConnectionString
$DbConnection.Open()

# Create SQL command for KILL clause
$DbCommand = New-Object System.Data.SQLClient.SQLCommand  
$DbCommand.Connection = $DbConnection 
$DbCommand.CommandText = $DbQuery 

# Execute KILL clause
$DbCommand.ExecuteNonQuery()

# Close connection
$DbConnection.Close()

それが役立つことを願っています

于 2015-11-16T22:35:11.877 に答える