我想更新同一个表中正在删除记录的字段,但不太确定如何删除。该表非常简单,并有自我参考:
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.我如何才能完成此操作?
答案 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