在使用 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