确定SQL触发器中的旧主键
我已经在某个地方做过了,我确信它!
我有一个SQL Server 2000表,我需要将更改记录到更新字段并插入到第二个日志记录表中。 下面是我使用的结构的简化版本:
MainTable
ID varchar(10) PRIMARY KEY
DESCRIPTION varchar(50)
LogTable
OLDID varchar(10)
NEWID varchar(10)
对于任何其他领域,这样的事情会很好:
Select i.DESCRIPTION As New, d.DESCRIPTION As Old
From Inserted i
LEFT JOIN Deleted d On i.ID=d.ID
......但显然,如果ID改变,联接将失败。
我无法修改表格,我在这个数据库中唯一的功能是创建一个触发器。
或者有人可以教我时间旅行,我会回到过去,然后问自己我是怎么做到的? 干杯:)
编辑:
我想我需要在这里澄清一些事情。 这实际上不是我的数据库 ,它是一个预先存在的系统,我几乎不能控制,除了写这个触发器。
我的问题是,如果所述主键已更改,如何检索旧的主键。 我不需要告诉我不应该改变主键或追逐外键等。这不是我的问题:)
是否有可能假定在触发器中向您呈现的INSERTED和DELETED表保证按照相同的顺序?
DECLARE @OldKey int, @NewKey int;
SELECT @Oldkey = [ID] FROM DELETED;
SELECT @NewKey = [ID] FROM INSERTED;
这仅适用于单行的情况。 否则,你没有“锚点”来链接新旧行。 因此,在INSERTED中检查触发器> 1。
我不认为这是可能的。 想象一下,如果你在表中有4行:
1 Val1
2 Val2
3 Val3
4 Val4
现在发出以下更新:
UPDATE MainTable SET
ID = CASE ID WHEN 1 THEN 2 WHEN 2 THEN 1 ELSE ID END
Description = CASE ID WHEN 3 THEN 'Val4' WHEN 4 THEN 'Val3' ELSE Description END
现在,你将如何区分第1行和第2行发生了什么以及第3和第4行发生了什么。更重要的是,你能描述它们之间的不同吗? 所有告诉你哪些列已被更新的东西不会对你有所帮助。
如果在这种情况下有可能在表格上有一个额外的密钥(例如描述是UNIQUE),并且您的更新规则允许它,您可以编写触发器来防止同时更新两个密钥,然后您可以使用任何密钥hasn'已经更新以关联这两个表格。
链接地址: http://www.djcxy.com/p/95661.html上一篇: Determine Old primary key in a SQL Trigger
下一篇: Query to get all foreign key constraints in SQL Server 2000