2012-05-18 59 views
1

我在一個SQL Server 2008 R2實例使用PowerShell創建一組數據庫,就像這樣:創建PowerShell的數據庫事務

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中,我只是將其包裝在BEGIN TRANROLLBACKCOMMIT中,但我可以在Powershell中執行此操作嗎?有一個cmdlet Start-Transaction,但它需要來自事務中使用的命令的支持,而$db.Create()則不需要。

有沒有辦法在SMO對象上做交易?我當然可以預先檢查所有的數據庫,但是整個腳本非常複雜,如果我可以使邏輯更接近創建,我覺得它會更容易理解。

回答

2

在一個事務中你不能在SQL包裝這個決定,因爲CREATE DATABASE不能在事務中就讀:

CREATE DATABASE語句必須運行自動提交模式(默認爲 事務管理模式),並且不允許在顯式或隱含事務中使用。

因此,PS,SMO或其他任何方式都無法實現此功能。缺乏交易需要仔細處理錯誤。要創建「全部或全部」數據庫,實現原子行爲將非常困難。如果您遇到錯誤,則無法保證您可以刪除已創建的數據庫。

如果可能的話,最好是茁壯成長:如果運行腳本並在數據庫5上遇到錯誤,下次運行它時,它將跳過已創建的數據庫1-4。或者,也可以刪除已經創建的數據庫(如果存在)並再次創建它們(這是有風險的,因爲腳本最終會由於操作員錯誤而丟失錯誤的數據庫)。

1

不能運行一個

if not exists(select 1 from sys.databases where name like ='your_db_name') begin 
create 
end else begin 
    log? 
end 
+0

這裏的想法是在Powershell內部進行的,如果可能的話,因爲在同一個任務中還有很多其他的事情要做。 – carlpett

+0

您可以在powershell中使用try/catch塊,並在catch塊中添加一些邏輯來「撤消」 - 刪除/刪除任何創建的數據庫。 –