sql DELETE触发器不会回滚

时间:2017-01-11 12:48:41

标签: sql sql-server triggers rollback

如果SELECT中的语句存在,则应该回滚触发器。问题是,事实并非如此。当我只从触发器运行SELECT时,它显示存在一行。但是当我尝试使用与触发器中硬编码相同的值的DELETE时,触发器会触发但不会执行回滚。任何人有任何想法可能是错的?

CREATE TRIGGER trg_del ON Projektbefattningar

FOR DELETE
AS

  SELECT @befNr = Befattningsnr, @pNr = pNr, @EtappNr = Etappnr FROM deleted
-- Not currently using these. Using hard coded values to illustrate my problem

    IF EXISTS (
        SELECT *
        FROM projektbefattningar
        WHERE Befattningsnr = 2 AND pNr = 1 and Etappnr = 1 AND Anställningsnr is not null
        )
    BEGIN
        RAISERROR('Could not delete, Anställningsnr is not null', 16, 1)
        --THROW 50001, 'Could not delete, Anställningsnr is not null', 1;
        ROLLBACK TRANSACTION;
    END

GO

2 个答案:

答案 0 :(得分:2)

当您使用FOR DELETE时,您认为在删除语句完成后将触发此TRIGGER。要在DELETE之前验证条件,您需要使用INSTEAD OF DELETE。您的触发器声明将是:

CREATE TRIGGER trg_del ON Projektbefattningar
INSTEAD OF DELETE
AS

现在要确认您的删除声明,您需要包含删除声明,它不会被删除。 最后的程序将是这样的:

CREATE TRIGGER trg_del ON Projektbefattningar

INSTEAD OF DELETE
AS

  SELECT @befNr = Befattningsnr, @pNr = pNr, @EtappNr = Etappnr FROM deleted
-- Not currently using these. Using hard coded values to illustrate my problem

    IF EXISTS (
        SELECT *
        FROM projektbefattningar
        WHERE Befattningsnr = 2 AND pNr = 1 and Etappnr = 1 AND Anställningsnr is not null
        )
    BEGIN
        RAISERROR('Could not delete, Anställningsnr is not null', 16, 1)
        --THROW 50001, 'Could not delete, Anställningsnr is not null', 1;
        ROLLBACK TRANSACTION;
    END
    ELSE
    BEGIN

       DELETE FROM YourTableToDelete Where idOfYourTable in ( Select idOfYourTable from Deleted )
    END

GO

答案 1 :(得分:0)

试试这个

CREATE TRIGGER trg_del ON Projektbefattningar
FOR DELETE
AS
SELECT @befNr = Befattningsnr
    ,@pNr = pNr
    ,@EtappNr = Etappnr
FROM deleted

-- Not currently using these. Using hard coded values to illustrate my problem
IF EXISTS (
        SELECT 1
        FROM deleted
        WHERE Befattningsnr = 2
            AND pNr = 1
            AND Etappnr = 1
            AND Anställningsnr IS NOT NULL
        )
BEGIN
    RAISERROR (
            'Could not delete, Anställningsnr is not null'
            ,16
            ,1
            )

    --THROW 50001, 'Could not delete, Anställningsnr is not null', 1;
    ROLLBACK TRANSACTION;
END
GO