【发布时间】:2022-01-11 23:25:39
【问题描述】:
场景:
- 表有 1 个或多个计算列。这些列仅根据表中其他列的值进行简单计算。列被标记为 PERSISTED。
- 表有一个 AFTER INSERT、UPDATE 触发器来插入或 UPDATE 行到第二个表。
- 第二个表架构相同,但没有计算列。
- 部署和表使用后(表现在有生产数据),确定计算有误,需要更正。
开发人员预计更改计算列的计算会导致触发器触发(基本上是 DML 操作)。观察到的更像是 DDL 操作。源表显示了计算更改的正确结果,但第二个表没有。计算的列值已得到纠正这一事实使开发人员得出结论,这些更改将反映在另一个表中。
我断言这样的表更改类似于更改列的类型。它是一个 DDL 操作,不属于会导致 DML 触发器触发的操作。问题是我是根据经验推断出这个结果。我还没有找到说明这应该是预期结果的文档。谁能赐教?
谢谢
【问题讨论】:
-
您不能更改计算列;如果你需要,你必须
DROP说专栏然后重新ADD它。这两个都是ALTER TABLE语句的一部分,它是一个DDL 语句。 [table]TRIGGER出现在创建它的表上的INSERT、UPDATE和/或DELETE语句之后;ALTER TABLE声明不是这些。 -
补充以上内容,如果一个动作的结果不清楚,通常会发生什么是你在开发中首先测试它;模拟相同的场景(尽管可能有一个与生产相同的开发服务器)并测试删除和添加新计算列的结果需要很少的努力,这样做会表明表上的任何触发器都不会火。所说的“开发人员”需要学习良好的做法。
-
如您所见,触发器未触发dbfiddle.uk/…
-
更好的问题是为什么另一个表也没有计算列
-
@Charlieface 第二张表因为 DRY 而没有计算。它是用于特定目的的航路点,仅用于反映原始表格的内容。重复代码意味着下次它必须在两倍的地方修复。
标签: sql triggers sql-server-2016 calculated-columns