简单触发器初学者防止删除

时间:2016-02-03 11:06:09

标签: sql sql-server tsql triggers

我正在尝试编写我的第一个触发器。我有元素表。我里面的记录很少。很少有记录在1上有复选框,在0上有几个。

我正在尝试制作触发器,以防止删除包含复选框1(elm_intcolumn1)的记录。

触发器正在工作但我无法删除带有复选框0的记录。触发器阻止了我的元素上的所有记录。

ALTER TRIGGER [dbo].[test]
    ON [dbo].[elements]
    INSTEAD OF DELETE
AS
BEGIN
    SELECT CASE
        WHEN elm_intcolumn1 = 1
            THEN 0
        WHEN elm_intcolumn1 = 0
            THEN 1
    END
    FROM elements
    BEGIN
        RAISERROR ('błąd', 16, 1)
        ROLLBACK TRANSACTION
        RETURN;
    END
END

2 个答案:

答案 0 :(得分:1)

检查虚拟表DELETEDINSERTED -

CREATE TABLE dbo.[elements] (
    id INT IDENTITY PRIMARY KEY,
    elm_intcolumn1 BIT
)
GO
INSERT INTO dbo.[elements] (elm_intcolumn1)
VALUES (0), (1)
GO

ALTER TRIGGER dbo.test
    ON dbo.[elements]
    AFTER DELETE
AS
BEGIN
    IF EXISTS(
        SELECT 1
        FROM DELETED
        WHERE elm_intcolumn1 = 1
    )
    BEGIN
        RAISERROR ('revert', 16, 1)
        ROLLBACK TRANSACTION
    END
END
GO

SELECT * FROM dbo.[elements]

DELETE dbo.[elements]
WHERE id = 2

删除第二条记录时:

Msg 50000, Level 16, State 1, Procedure test, Line 39
revert
Msg 3609, Level 16, State 1, Line 29
The transaction ended in the trigger. The batch has been aborted.

答案 1 :(得分:0)

您的解决方案过于复杂。

首先 - 您不需要检查创建了触发器的表,而是检查xcodebuild [...] -sdk iphonesimulator PLATFORM_NAME=iphonesimulator 触发器上下文中可用的名为deleted的特殊表。此表格包含您尝试删除的记录。

第二 - 你的支票应该是简单的"是否有记录有" elm_intcolumn1 = 1"在删除的表格中#34;。如果是 - 那么抛出异常,如果没有这样的记录 - 然后从表中删除instead of delete中的所有记录。在这种情况下,您的表应该有一些主键(我假设它在下面的示例中名为deleted。)

所以从字面上看它是这样的:

ID

请注意,您必须在此触发器中明确删除表中的记录,因为它是if exists(select * from deleted where elm_intcolumn1 = 1) begin RAISERROR ('błąd', 16, 1) ROLLBACK TRANSACTION RETURN; end else begin delete from elements where ID in (select ID from deleted) end ,而不是instead of delete

或者,您可以将触发类型更改为after delete,以便不需要after delete条件分支中的显式删除。