在使用 transact-SQL 删除触发器之前
Before delete trigger using transact-SQL
我需要防止删除职业为 'Programmer' 的用户。
所以,数据库 table 结构是:
TABLE Client
Id | Name | SSN | Occupation | Birthdate |
到目前为止我创建的触发器如下所示:
CREATE TRIGGER Check_User_Occupation
ON dbo.Client
FOR DELETE
AS
BEGIN
IF(SELECT c.Occupation
FROM deleted AS d
INNER JOIN Client as c ON d.Id = c.Id) = 'Programmer'
BEGIN
PRINT 'YES';
ROLLBACK TRAN
RAISEERROR(SELECT 'Could not delete client because he is a programmer');
END
END
GO
我想该行在比较之前就被删除了,但我不知道处理这个问题的正确方法。
感谢任何帮助!
正确的语法在这里:
(你不需要加入 deleted table 到 table 本身,在 deleted 中是 delete 语句中的整行......)但请注意一个事实,你无法做到在这种情况下批量删除。它仅适用于行删除。
CREATE TRIGGER Check_User_Occupation
ON dbo.Client
FOR DELETE
AS
BEGIN
IF(SELECT Occupation FROM deleted) = 'Programmer'
BEGIN
PRINT 'YES';
ROLLBACK
RAISERROR ('Could not delete client because he is a programmer', -- Message text
16, -- Severity
1 -- State
)
END
END
GO
对于批处理命令,最好使用以下语句:
IF(SELECT COUNT(*) FROM deleted WHERE Occupation = 'Programmer') > 0
但是如果你想加入这个 table,你需要使用
INSTEAD OF DELETE
在这种情况下你不需要使用 ROLLBACK
最终它应该看起来像:
CREATE TRIGGER Check_User_Occupation
ON dbo.Client
INSTEAD OF DELETE
AS
BEGIN
IF(SELECT Occupation FROM deleted) = 'Programmer'
BEGIN
PRINT 'YES';
RAISERROR ('Could not delete client because he is a programmer', -- Message text
16, -- Severity
1 -- State
)
END
END
GO
我需要防止删除职业为 'Programmer' 的用户。 所以,数据库 table 结构是:
TABLE Client
Id | Name | SSN | Occupation | Birthdate |
到目前为止我创建的触发器如下所示:
CREATE TRIGGER Check_User_Occupation
ON dbo.Client
FOR DELETE
AS
BEGIN
IF(SELECT c.Occupation
FROM deleted AS d
INNER JOIN Client as c ON d.Id = c.Id) = 'Programmer'
BEGIN
PRINT 'YES';
ROLLBACK TRAN
RAISEERROR(SELECT 'Could not delete client because he is a programmer');
END
END
GO
我想该行在比较之前就被删除了,但我不知道处理这个问题的正确方法。
感谢任何帮助!
正确的语法在这里:
(你不需要加入 deleted table 到 table 本身,在 deleted 中是 delete 语句中的整行......)但请注意一个事实,你无法做到在这种情况下批量删除。它仅适用于行删除。
CREATE TRIGGER Check_User_Occupation
ON dbo.Client
FOR DELETE
AS
BEGIN
IF(SELECT Occupation FROM deleted) = 'Programmer'
BEGIN
PRINT 'YES';
ROLLBACK
RAISERROR ('Could not delete client because he is a programmer', -- Message text
16, -- Severity
1 -- State
)
END
END
GO
对于批处理命令,最好使用以下语句:
IF(SELECT COUNT(*) FROM deleted WHERE Occupation = 'Programmer') > 0
但是如果你想加入这个 table,你需要使用
INSTEAD OF DELETE
在这种情况下你不需要使用 ROLLBACK
最终它应该看起来像:
CREATE TRIGGER Check_User_Occupation
ON dbo.Client
INSTEAD OF DELETE
AS
BEGIN
IF(SELECT Occupation FROM deleted) = 'Programmer'
BEGIN
PRINT 'YES';
RAISERROR ('Could not delete client because he is a programmer', -- Message text
16, -- Severity
1 -- State
)
END
END
GO