c# - 如果新约束验证失败,则 DacServices 回滚

标签 c# sql-server dac

我们正在使用 DacServices 更新我们的数据库。然而,有时添加新的约束会导致 Constraint Violations,这需要我们编写迁移脚本以确保列中的数据有效。

但是对于 DacServices.Deploy,如果 ScriptNewConstraintValidation 选项为真并且新约束错误,我不知道如何回滚 DacServices 所做的更改。

我们正在使用 AlwaysOn Availability,因此执行备份/恢复会非常困难。以下是我尝试过但没有成功的一种方法。

var dacServices = new DacServices(dbConnection.ConnectionString);
var deploymentOptions = new DacDeployOptions
{
    CreateNewDatabase = createNewDatabase,
    ScriptDatabaseCompatibility = false,
    ScriptDatabaseCollation = false,
    IgnoreUserSettingsObjects = true,
    DropPermissionsNotInSource = false,
    DropRoleMembersNotInSource = false,
    IgnorePermissions = true,
    IgnoreRoleMembership = true,
    GenerateSmartDefaults = true,
    IncludeTransactionalScripts = true,
    ScriptNewConstraintValidation = true
};

Microsoft.SqlServer.Dac.DacPackage dacPackage = DacPackage.Load(dacPath);

Console.WriteLine("Deploying DacPac");
CancellationTokenSource tokenSource = new CancellationTokenSource();
try
{
    dacServices.Deploy(dacPackage, databaseName, true, deploymentOptions, tokenSource.Token);
}
catch(Exception)
{
    tokenSource.Cancel();
}

最佳答案

正如 OP 指出的那样,这里的问题是验证新约束的步骤发生在 IncludeTransactionalScripts 设置为时包含的事务语句中。这意味着将提交对数据库的更改,即使部署指定的约束与数据库中的数据不一致。这似乎是 Microsoft 应该修复的错误。

尽管如此,我的建议是使用 DacServices 框架生成部署脚本,而不是直接部署到数据库。生成脚本后,您可以添加事务语句以确保脚本的完整性 作为原子事务执行。您可以在 USE [$(DatabaseName)]; 之后插入一个 BEGIN TRANSACTION 语句; GO 语句,然后是脚本末尾的 COMMIT TRANSACTION 语句。

但有两点需要注意:1) 生成的脚本必须SQLCMD 执行(您不能只使用 C# SqlConnection 甚至 SMO ServerConnection 例如),2) 我建议如果您手动将脚本包装在事务中,则跳过将 IncludeTransactionalScripts 设置为

关于c# - 如果新约束验证失败,则 DacServices 回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35161541/

相关文章:

c# - 如何避免 C# 字符串中的双引号转义?

随着多行文本框中字符串的增长,C# 应用程序变得缓慢且无响应

c# - 是否可以通过 C# 访问 CPU 缓存(读写)?

c# - FieldConverter ConverterKind.Date "dd/MM/yyyy"异常

sql-server - 连接多个表中的多行

audio - 在微 Controller (Arduino)中播放音频文件

sql-server - SQL 错误 : The multi-part identifier . .. 无法绑定(bind)

sql-server - SSIS 在包执行的预执行阶段的结构行为是什么?为什么重包会在预执行阶段挂起?

c++ - Windows 10 中的注册表权限

visual-studio - 无法使用 DacFX 部署到 Azure 故障转移组内的 Azure SQL 数据库