請注意,如果您用適當的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','[email protected]',2 ),
(2,'Jane ','[email protected] ',NULL),
(3,'John ','[email protected] ',1 ),
(4,'Brett','[email protected]',2 );
SELECT * FROM dbo.Users;
GO
DELETE dbo.Users WHERE UserID = 2;
GO
SELECT * FROM dbo.Users;
GO
DROP TABLE dbo.Users;
GO
你知道這隻會在你不*有自引用外鍵的時候纔有效,對嗎?這意味着你可以在EmailUserID中填充任何值,並且SQL Server不會抱怨。 – 2012-02-18 16:45:02