【发布时间】: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