【问题标题】:Sql trigger is not firing on Update, whySql 触发器在更新时未触发,为什么
【发布时间】:2014-06-02 12:43:01
【问题描述】:

我想将 Customer 表中发生的更改保存到 SQL Server 2008 中的另一个表 Notification 中。为此,我编写了以下触发器:

CREATE TRIGGER [CustomerNotifier]
                         ON [dbo].[Customer]
                         AFTER INSERT, UPDATE, DELETE
                         AS
                         BEGIN
                            DECLARE @Action as char(1);
                            SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED)
                                                  AND EXISTS(SELECT * FROM DELETED)
                                                    THEN 'U'  -- Set Action to Updated.
                                                WHEN EXISTS(SELECT * FROM INSERTED)
                                                    THEN 'I'  -- Set Action to Insert.
                                                WHEN EXISTS(SELECT * FROM DELETED)
                                                    THEN 'D'  -- Set Action to Deleted.
                                                ELSE NULL     -- Skip. It may have been a 'failed delete'.   
                                          END)

                            IF @Action = 'I'
                            BEGIN
                                INSERT INTO Notification (CustomerId, BookingId, [Type], [Read], TenantId, TenantUsername, CreatedDateTime)
                                SELECT CustomerId, null, 0, 0, TenantId, AspNetUsers.UserName, CURRENT_TIMESTAMP FROM inserted
                                JOIN AspNetUsers ON  inserted.TenantId = AspNetUsers.Id;
                            END
                            ELSE IF @Action = 'U'
                            BEGIN
                                INSERT INTO Notification (CustomerId, BookingId, [Type], [Read], TenantId, TenantUsername, CreatedDateTime)
                                SELECT CustomerId, null, 1, 0, TenantId, AspNetUsers.UserName, CURRENT_TIMESTAMP FROM inserted
                                JOIN AspNetUsers ON  inserted.TenantId = AspNetUsers.Id;
                            END
                            ELSE IF @Action = 'D'
                            BEGIN
                                INSERT INTO Notification (CustomerId, BookingId, [Type], [Read], TenantId, TenantUsername, CreatedDateTime)
                                SELECT CustomerId, null, 1, 0, TenantId, AspNetUsers.UserName, CURRENT_TIMESTAMP FROM deleted
                                JOIN AspNetUsers ON  deleted.TenantId = AspNetUsers.Id;
                            END
                         END

当客户从客户表中插入或删除时触发器执行成功,但触发器没有在更新时执行。

我可能知道原因:它没有执行,因为我们正在更新另一个表 AspNetUsers 中的条目,该表通过共享主键关系与 Customer 表链接。

所以我的问题是我应该怎么做才能在 Update 上执行这个触发器??

【问题讨论】:

  • 如果问题不清楚,请要求澄清

标签: sql-server tsql triggers


【解决方案1】:

只有在定义触发器的表上有相应的 DML 时,触发器才会触发。

要在此处执行触发器,您应该在发生实际更新的AspNetUsers 表上创建触发器,或者更新Customer 表。请记住,inserted 和 deleted 伪表将包含定义触发器的表的数据。

【讨论】:

    猜你喜欢
    • 2015-01-20
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2010-11-18
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多