确定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