2012-05-18 33 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块中添加一些逻辑来“撤消” - 删除/删除任何创建的数据库。 –