我有一个简单的详细信息表:
listid
custid
status
last_changed
主键由listid
和custid
组成。
现在我正在尝试设置一个触发器,每次插入或更新发生时,将last_changed
列设置为当前日期时间。我已经找到了很多关于如何使用单个PK列的信息,但是如果使用多个PK,它会如何从INSERTED表中正确指定PK而感到困惑。
触发器必须在SQL Server 2005/2008 / R2中工作。
感谢您提供有效的触发器代码!
奖励还将是检查数据是否实际被更改并且仅在这种情况下更新last_changed但是为了实际理解如何正确编码主要问题我希望将其视为单独的代码块,如果在所有
答案 0 :(得分:10)
嗯....只是因为主键由两列组成,不应该产生很大的影响....
CREATE TRIGGER dbo.trgAfterUpdate ON dbo.YourTable
AFTER INSERT, UPDATE
AS
UPDATE dbo.YourTable
SET last_changed = GETDATE()
FROM Inserted i
WHERE dbo.YourTable.listid = i.listid AND dbo.YourTable.custid = i.custid
您只需要在两列上建立两个表(您自己的数据表和Inserted
伪表)之间的JOIN ...
我错过了什么吗? .....
答案 1 :(得分:1)
CREATE TRIGGER dbo.trgAfterUpdate ON dbo.YourTable
AFTER INSERT, UPDATE
AS
UPDATE dbo.YourTable
SET last_changed = GETDATE()
FROM Inserted i
JOIN dbo.YourTable.listid = i.listid AND dbo.YourTable.custid = i.custid
WHERE NOT EXISTS
(SELECT 1 FROM Deleted D Where D.listid=I.listid AND D.custid=i.custid AND (D.status=i.status)
这里我假设stasus列不可为空。如果是,则应添加其他代码以检查其中一列是否为NULL
答案 2 :(得分:0)
您可以通过比较插入和删除表中的数据来检查触发器中的每个字段,如下所示:
CREATE TRIGGER [dbo].[tr_test] ON [dbo].[table]
AFTER INSERT, UPDATE
AS
BEGIN
DECLARE @old_listid INT
DECLARE @old_custid INT
DECLARE @old_status INT
DECLARE @new_listid INT
DECLARE @new_custid INT
DECLARE @new_status INT
SELECT @old_listid=[listid], @old_custid=[custid], @old_status = [status] FROM [deleted]
SELECT @new_listid=[listid], @new_custid=[custid], @new_status = [status] FROM [inserted]
IF @oldstatus <> @new_status
BEGIN
UPDATE TABLE table SET last_changed = GETDATE() WHERE [listid] = @new_listid AND [custid] = @new_custid
END
END