1

我正在使用 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 TRANand ROLLBACKorCOMMIT中,但我可以在 Powershell 中执行此操作吗?有一个 cmdlet Start-Transaction,但它需要事务中使用的命令的支持,但$db.Create()不需要。

对象中有没有办法SMO进行交易?我当然可以提前检查所有的数据库,但是整个脚本相当复杂,我觉得如果我能把逻辑更接近于创建的话会更容易理解。

4

2 回答 2

2

您也无法将其包装在事务中的 SQL 中,因为CREATE DATABASE无法在事务中注册:

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

所以PS、SMO或任何其他方式都无法实现该能力。在缺少事务的情况下,您需要小心处理错误。要创建“全部或全部”数据库,要实现原子行为将非常困难。如果遇到错误,则不能保证可以删除已创建的数据库。

如果可能,最好使用幂等性:如果您运行脚本并在数据库 5 上遇到错误,下次运行它会跳过已经创建的数据库 1-4。或者,如果存在,它会删除已经创建的数据库并再次创建它们(这是有风险的,因为脚本可能最终会由于操作员错误而删除错误的数据库)。

于 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 回答