SQL Server 2008 - 如何使用DELETE触发器更新字段

时间:2012-02-18 15:57:44

标签: sql sql-server-2008

我想更新同一个表中正在删除记录的字段,但不太确定如何删除。该表非常简单,并有自我参考:

UserID    FName   EmailAddress  EmailUserID
1         Frank   frank@g.com   2
2         Jane    jane@g.com    NULL
3         John    john@g.com    1
4         Brett   brett@g.com   2

这是我的触发器:

CREATE TRIGGER [dbo].[CAT_DeleteUser]
   ON  Users
   AFTER DELETE
AS 
BEGIN

    SET NOCOUNT ON;

    UPDATE Users
    SET EmailUserID = NULL
    WHERE EmailUserID = ID_OF_DELETED_USER <-- don't know how to get this

END

因此,如果我删除Jane(UserID = 2),我希望触发器更新任何记录,其EmailUserID为2.我如何才能完成此操作?

3 个答案:

答案 0 :(得分:7)

您可以使用AFTER DELETE Trigger:

CREATE TRIGGER [dbo].[CAT_DeleteUser] ON  Users
   AFTER DELETE
AS 
BEGIN

    SET NOCOUNT ON;

    UPDATE Users
    SET EmailUserID = NULL
    FROM Users
    JOIN DELETED
      ON Users.EmailUserID = Deleted.UserID

END

答案 1 :(得分:3)

请注意,如果使用正确的FOREIGN KEY约束设置表,则后触发器不会执行此任务。 DELETE在触发操作之前逻辑上发生,因此您将获得:

Msg 547, Level 16, State 0, Line 2
The DELETE statement conflicted with the SAME TABLE REFERENCE constraint ...

因此,如果您确实希望数据完整性,以便没有人可以将垃圾填入EMailUserID列,您可以使用INSTEAD OF触发器,如下所示:

CREATE TABLE dbo.Users
(
    UserID INT NOT NULL PRIMARY KEY,
    FName  NVARCHAR(32),
    EmailAddress VARCHAR(320),
    EmailUserID INT NULL FOREIGN KEY REFERENCES dbo.Users(UserID)
);
GO

CREATE TRIGGER [dbo].[CAT_DeleteUser] 
ON dbo.Users
INSTEAD OF DELETE
AS 
BEGIN
    SET NOCOUNT ON;

    -- clean up references first
    UPDATE u SET u.EmailUserID = NULL
        FROM dbo.Users AS u
        INNER JOIN deleted AS d
        ON u.EmailUserID = d.UserID;

    -- now delete the row
    DELETE u
    FROM dbo.Users AS u
    INNER JOIN deleted AS d
    ON u.UserID = d.UserID;
END
GO

示例尝试在dbo.Users中创建tempdb的副本,如上所述,然后运行此代码:

INSERT dbo.Users(UserID, FName, EmailAddress, EmailUserID) VALUES
(1,'Frank','frank@g.com',2   ),
(2,'Jane ','jane@g.com ',NULL),
(3,'John ','john@g.com ',1  ),
(4,'Brett','brett@g.com',2  );

SELECT * FROM dbo.Users;
GO

DELETE dbo.Users WHERE UserID = 2;
GO

SELECT * FROM dbo.Users;
GO

DROP TABLE dbo.Users;
GO

答案 2 :(得分:2)

抱歉,第一次出错了问题......在这种情况下可以触发后触发:

CREATE TRIGGER [dbo].[CAT_DeleteUser]
   ON  Users
   AFTER DELETE
AS 
BEGIN

    SET NOCOUNT ON;

    UPDATE Users
    SET EmailUserID = NULL
    WHERE EmailUserID IN (SELECT UserID FROM DELETED)

END