【发布时间】:2010-07-16 20:39:59
【问题描述】:
这是一个非常有趣的问题。我正在使用 SQL Server 2008。 我在一张公用表上有两个触发器,比如“CommonTable”。一个触发器正在更新,另一个触发器正在插入/更新/删除。
- 在第一个触发器“Trigger1”中,我执行检查/回滚有时会根据业务逻辑更改新插入的值。 这是示例代码
-
CREATE TRIGGER [dbo].[Trigger1] ON [dbo].[CommonTable]
FOR UPDATE
UPDATE [CommonTable]
SET
[StatusCode] = 'New Value'
WHERE
[RecId] = 'rec id value'
- 在第二个触发器“Trigger2”中,我将新插入/删除/更新的值从“CommonTable”表存储到另一个表“CommonTable_History”,用于历史跟踪。 这是示例代码
-
CREATE TRIGGER [dbo].[Trigger2] ON [dbo].[CommonTable]
FOR INSERT, UPDATE, DELETE
--based on logic read the value from DELETED or INSERTED table and store in other table.
SELECT @RowData = (SELECT * FROM DELETED AS [CommonTable] WHERE [RecId] = @RowRecId FOR XML AUTO, BINARY BASE64 , ELEMENTS)
--and then insert @RowData in 'CommonTable_History' table.
在“sp_settriggerorder”的帮助下,我设置了这些触发器的执行顺序,因此首先执行“Trigger1”,然后执行“Trigger2”。
第二个触发器“Trigger2”适用于插入/删除值。如果第一个触发器“Trigger1”没有更改新插入的值,则它适用于新插入的值。
但如果在某些情况下,“Trigger1”中的插入值已更改。说 [StatusCode] = 'New Value' 并且旧值是 'Old Value' 然后“Trigger2”仍然存储“旧值”而不是“新值”。 为什么因为“Trigger1”更改了值,但该值仍未存储在数据库中,并且在“Trigger2”在 Insert 上执行之前。 现在我的要求是,我想在这里存储“新值”。
所以我想,让“Trigger2”使用“AFTER”关键字。但是“FOR”和“AFTER”的行为相同并不能解决问题。
然后我想,让“Trigger2”使用“INSTEAD OF”关键字。但是“INSTEAD OF”给出了以下错误 “不能创建 INSTEAD OF DELETE 或 INSTEAD OF UPDATE TRIGGER。这是因为该表有一个 FOREIGN KEY 与级联 DELETE 或 UPDATE。”
我无法通过级联 DELETE 或 UPDATE 删除表“CommonTable”的 FOREIGN KEY。
如果你们有任何其他替代解决方案,请告诉我。 -维克拉姆·格洛特
【问题讨论】:
标签: sql sql-server