13

次のステートメントが 1 つのトランザクションで実行されていることを確認するにはどうすればよいですか?

try
{
  Invoke-SqlCmd -Query 'begin tran; ...sql script...'
  # Other Powershell script
  Invoke-SqlCmd -Query '...sql script...; if @@transcation > 0 commit tran' 
}
catch 
{
   Invoke-SqlCmd -Query 'if @@transaction > 0 rollback tran;'
}

トランザクションでPowershellスクリプトを実行する最良の方法は何ですか?

4

5 に答える 5

16

残念ながら、 Powershell にはプロバイダーSqlProviderのようなトランザクション機能がありません。RegistryしたがってStart-transaction、ここでは機能しません。

ネイティブに移行して、 TransactionScopeクラスを利用できます。

Try{
   $scope = New-Object -TypeName System.Transactions.TransactionScope

   Invoke-Sqlcmd -server Darknite -Database AdventureWorks2008 -Query $Query1 -ea stop
   Invoke-Sqlcmd -server Darknite -Database AdventureWorks2008 -Query $Query2 -ea stop

   $scope.Complete() 
}
catch{
    $_.exception.message
}
finally{
    $scope.Dispose() 
}

$scope 割り当てと の間に置かれたすべての Invoke-sqlcmds は$scope.complete()、1 つのトランザクションとして扱われます。それらのいずれかがエラーになった場合、すべてがロールバックされます。

于 2015-01-13T06:53:42.813 に答える
4

Invoke-sqlcmd は ADO.NET トランザクションをサポートしていません。次の ADO.NET トランザクションに関する MSDN ドキュメントに示されている C# コードと同等の Powershell コードを記述します 。 .aspx

または、T-SQL トランザクションを使用します。各スクリプトに T-SQL Try/Catch を追加せずにこれを行う簡単な方法は、XACAT_ABORT を ON に設定することです。次に、スクリプトを begin でラップし、トランザクションをコミットします。これは終了エラーをキャッチしない場合があることに注意してください。

http://msdn.microsoft.com/en-us/library/ms188792.aspx

于 2012-12-20T19:17:07.690 に答える
2

最近、トランザクションをサポートするデータベースとやり取りするための新しいモジュールを公開しました。

Install-Module -Name InvokeQuery

エラーが発生した場合、明示的にロールバックする必要はありません。で作成されたアンビエント トランザクションがそれを処理Start-Transactionします。

try {
    $db = "test"
    Start-Transaction

    $sql = "insert into table1 values (NEWID(), 8765, 'transactions!', GETDATE())"
    $rowcount = $sql | Invoke-SqlServerQuery -Database $db -UseTransaction -CUD -Verbose
    Write-Host "Inserted $rowcount rows!"

    $sql = "insert into table1 values (NEWID(), 5555, 'transaction too!', GETDATE())"
    $rowcount = $sql | Invoke-SqlServerQuery -Database $db -UseTransaction -CUD -Verbose
    Write-Host "Inserted $rowcount rows!"

    Complete-Transaction
}
catch {
    ##Transaction will automatically be rolled back....
    Write-Error $_
}

トランザクション内で明示的にロールバックする場合は、エラーをスローします。

throw 'rollback because of reason X!'

その他の例: https://github.com/ctigeek/InvokeQueryPowershellModule/blob/master/README.md#transactions

于 2016-05-10T21:13:32.683 に答える