1

次のように、PowerShellを使用してSQLServer2008R2インスタンスにデータベースのセットを作成しています。

foreach ($database in $databases) {
    # Create DB
    $db = New-Object Microsoft.SqlServer.Management.SMO.Database
    $db.Parent = Get-Item "SQLSERVER:\SQL\$DBServer\$Instance"
    $db.Name = $database
    $db.Create()

    #
    # Create tables, fill in data, etc
    #
}

ここでは、作成するデータベースがまだ存在しないと想定しています。その場合は、中止してロールバックしたいと思います。SQLでは、これをaBEGIN TRANROLLBACKorCOMMITでラップするだけですが、Powershellでこれを実行できますか?コマンドレットがありStart-Transactionますが、トランザクションで使用されるコマンドからのサポートが必要であり、そうではあり$db.Create()ません。

SMOオブジェクトにトランザクションを実行する方法はありますか?もちろん、事前にすべてのデータベースをチェックすることもできますが、スクリプト全体が非常に複雑であり、ロジックを作成に近づけることができれば、より理解しやすいと思います。

4

2 に答える 2

2

CREATE DATABASEトランザクションに登録できないため、これをトランザクションのSQLでラップすることもできませんでした。

CREATE DATABASEステートメントは、自動コミットモード(デフォルトのトランザクション管理モード)で実行する必要があり、明示的または暗黙的なトランザクションでは許可されません。

したがって、この機能はPS、SMO、またはその他の方法では実現できません。トランザクションが不足している場合は、エラーを慎重に処理する必要があります。「すべてまたはまったく」データベースを作成するためのアトミックな動作を実現することは非常に困難です。エラーが発生した場合、作成済みのデータベースを削除できる保証はありません。

可能であれば、べき等性のために繁栄することをお勧めします。スクリプトを実行してデータベース5でエラーが発生した場合、次に実行すると、既に作成されているデータベース1〜4がスキップされます。または、すでに作成されているデータベースが存在する場合は削除して再度作成します(オペレーターのエラーにより、スクリプトが間違ったDBを削除する可能性があるため、これは危険です)。

于 2012-05-18T14:16:40.880 に答える
1

あなたは実行できません

if not exists(select 1 from sys.databases where name like ='your_db_name') begin
 create
end else begin
  log?
end
于 2012-05-18T12:55:19.500 に答える