触发器和事务

OMG*_*ies 5 trigger sql-server-2005 sql-server transaction

我们最近进行了更改,以根据以前在存储过程中使用的逻辑创建约束,其中一部分包括使用INSTEAD OF触发器来集中逻辑。

逻辑通常很简单:

  1. 存储过程包含针对视图的 INSERT(或 UPDATE)语句,该视图具有 INSTEAD OF INSERT/UPDATE 触发器
  2. 触发器包含实际的逻辑——通常是两条语句,处理一条记录到主表和一个(或多个)支持表(包括参照完整性)的插入/更新。

问题是当触发器中的语句中遇到类似 CHECK 约束的东西时。事务被转储,一切都被回滚。我正在考虑必须在有问题的存储过程中复制 CHECK/etc 约束以在触发器执行之前进行验证——还有其他选择吗?

Con*_*lls 3

可能不会。违反声明性约束总是会引发错误并阻止事务提交违反约束的写入。数据库约束(检查、外键、唯一性等)的要点是,它们通过中止违反约束的写入来防止无效数据记录在数据库中。违反约束会引发错误并回滚事务。

如果您希望事务正常失败,您必须处理异常或在尝试写入数据之前预先验证数据。在后一种情况下,您将必须替换存储过程中的验证或在应用程序中实现验证。