插入后,使用两列主键更新时间戳触发器

时间:2011-09-23 12:25:35

标签: sql-server triggers

我有一个简单的详细信息表:

listid
custid
status
last_changed

主键由listidcustid组成。

现在我正在尝试设置一个触发器,每次插入或更新发生时,将last_changed列设置为当前日期时间。我已经找到了很多关于如何使用单个PK列的信息,但是如果使用多个PK,它会如何从INSERTED表中正确指定PK而感到困惑。

触发器必须在SQL Server 2005/2008 / R2中工作。

感谢您提供有效的触发器代码!

奖励还将是检查数据是否实际被更改并且仅在这种情况下更新last_changed但是为了实际理解如何正确编码主要问题我希望将其视为单独的代码块,如果在所有

3 个答案:

答案 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