我在 SQLCLR 程序集中实现了一个后触发器。在其中我想知道哪些列已经真正更新(并且它们的值已经改变)。
不幸的是,SqlContext.TriggerContext.IsUpdatedColumn 返回 true,即使列值仍然相同。我想,这只是因为一个不太智能的服务器应用程序准备的 SQL 查询重写了所有列,即使其中一些列没有被用户更改。
第二个问题是某些列具有 ntext 类型,因此我什至无法从 INSERTED 伪表中选择它们(MS SQL Server 不允许从 INSERTED 中选择具有 ntext 类型的字段)。这就是为什么现在我 SELECT 使用以下查询更改了行:
SELECT * FROM [dbo].[MyTable] WHERE [id] IN (SELECT [id] FROM INSERTED)
我应该怎么做才能知道,哪些列不仅更新了,而且改变了?
现在我有一个简单的想法:创建另一个触发器,BEFORE,并从内部保存更新的行。然后,当执行 AFTER 触发器时,比较列值。这个想法是我能做的最好的事情吗?如果是这样,在 BEFORE 和 AFTER 触发器之间保留更改的行的最佳位置是什么?在执行 AFTER 触发器之前将删除一个临时表,因为我关闭了上下文连接(也许,只是不关闭?)。