以事务方式使用powershell创建数据库

时间:2012-05-18 12:52:20

标签: sql-server powershell

我正在使用powershell在SQL Server 2008R2实例上创建一组数据库,如下所示:

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 个答案:

答案 0 :(得分:2)

由于CREATE DATABASE无法在事务中注册,因此您无法在事务中将其包装在SQL中:

  

CREATE DATABASE语句必须以自动提交模式运行(默认设置)   事务管理模式)并且不允许在显式或   隐式交易。

因此无法在PS,SMO或任何其他方式实现这种能力。在缺乏交易时,您需要仔细处理错误。要实现全部或全部的原子行为是非常困难的。要创建的数据库。如果遇到错误,则无法保证可以删除已创建的数据库。

如果可能的话,最好是为了幂等而茁壮成长:如果你运行脚本并在数据库5上遇到错误,下次运行它时会跳过已经创建的数据库1-4。或者,它会丢弃已经创建的数据库(如果存在)并再次创建它们(这是有风险的,因为脚本可能由于操作员错误而最终丢弃错误的DB)。

答案 1 :(得分:1)

你可以运行

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