【问题标题】:Before delete trigger using transact-SQL使用 Transact-SQL 删除触发器之前
【发布时间】:2017-08-28 19:16:04
【问题描述】:

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

 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

我猜该行在可以比较之前就被删除了,但我不知道处理这个问题的正确方法。

感谢任何帮助!

【问题讨论】:

  • 使用而不是删除触发器。

标签: tsql triggers sql-delete


【解决方案1】:

正确的语法在这里:

(您不需要将已删除的表连接到表本身,在 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

但是ofc如果要加入这个表,就需要使用

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2021-02-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多