2012-03-01 185 views
11

我有一个包含3个字段[ID,Name,LastUpdated]的表。
LASTUPDATED有GETDATE(的”默认值),所以它会自动填写自己当增加一个新的记录。T-SQL触发器更新

当我改为运行上表的更新,我想有这个领域本身重置为当前GETDATE ()

CREATE TRIGGER dbo.Table1_Updated 
    ON dbo.Table1 
    AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 
    UPDATE dbo.Table1 SET LastUpdated = GETDATE() 
END 
GO 

但是因为我没有WHERE子句,所有记录得到更新

问:
我会在哪里得到更新的记录的ID的价值UPD ATE触发器?

我是否正在更新Trigger中的表的字段,重新调用新的Trigger事件(以此类推)?

+0

@Damien_The_Unbeliever知道我明白这一点,但这个线程,不过是为了我理解的概念样本。这不是真正的代码。 – 2012-03-02 21:22:16

回答

21

从'INSERTED',INSERTED表对于INSERT,UPDATE触发器都是通用的。

CREATE TRIGGER dbo.Table1_Updated 
ON dbo.Table1 
FOR INSERT, UPDATE /* Fire this trigger when a row is INSERTed or UPDATEd */ 
AS BEGIN 
    UPDATE dbo.Table1 SET dbo.Table1.LastUpdated = GETDATE() 
    FROM INSERTED 
    WHERE inserted.id=Table1.id 
END 
+0

所以即使TSQL只是在任何字段上执行UPDATE,在触发器内部我会去查找插入的虚拟表?顺便说一句,我需要把插入...即使我只需要更新? – 2012-03-01 20:19:30

1
Update table1 
set LastUpdated = getdate() 
from inserted i, table1 a 
where i.pk1 = a.pk1 
+0

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=57227 – 2012-03-01 20:04:46