【问题标题】:T-SQL Trigger UpdateT-SQL 触发器更新
【发布时间】:2012-03-01 19:52:09
【问题描述】:

我有一个包含 3 个字段 [ID、名称、LastUpdated] 的表。
LastUpdated 的默认值为“GetDate(),因此在添加新记录时它会自动填充。

当我改为在 TABLE 上运行 UPDATE 时,我希望将此字段自行重置为当前的 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 值?

如果我在 Trigger 内更新表的字段,是否会重新调用新的 Trigger 事件(等等)?

【问题讨论】:

    标签: tsql triggers


    【解决方案1】:

    从“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
    

    【讨论】:

    • 所以即使 TSQL 只是在任何字段上执行更新,在触发器内部我去寻找插入的虚拟表?顺便说一句,我需要放 FOR INSERT ...即使我只需要 FOR UPDATE 吗?
    【解决方案2】:
    Update table1
    set LastUpdated = getdate()
    from inserted i, table1 a
    where i.pk1 = a.pk1
    

    【讨论】:

      【解决方案3】:
      CREATE TRIGGER dbo.refreshModifyDate 
            ON  tStoreCategoriesImages
            FOR INSERT, UPDATE
      AS 
        BEGIN
          SET NOCOUNT ON;
              update t set t.ModifyDate = getdate() from tStoreCategoriesImages t 
              inner join inserted i on i.ID = t.ID
        END
      GO
      

      【讨论】:

      • 欢迎来到 Stack Overflow!虽然此代码可能会回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将提高​​答案的长期价值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2018-04-15
      • 2017-11-30
      相关资源
      最近更新 更多