我正在使用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 TRAN
和ROLLBACK
或COMMIT
中,但我可以在Powershell中执行此操作吗?有一个cmdlet Start-Transaction
,但它需要来自事务中使用的命令的支持,而$db.Create()
则不需要。
SMO
对象中有没有办法进行交易?我当然可以提前检查所有数据库,但整个脚本非常复杂,如果我能让逻辑更接近创建,我觉得更容易理解。
答案 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