Tsql 在使用transact-SQL删除触发器之前

Tsql 在使用transact-SQL删除触发器之前,tsql,triggers,sql-delete,Tsql,Triggers,Sql Delete,我需要防止删除职业为“程序员”的用户。 因此,数据库表结构为: 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

我需要防止删除职业为“程序员”的用户。 因此,数据库表结构为:

 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语句中,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
但是如果你想加入这个表,你需要使用

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

使用而不是删除触发器。