我正在尝试编写我的第一个触发器。我有元素表。我里面的记录很少。很少有记录在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
答案 0 :(得分:1)
检查虚拟表DELETED
和INSERTED
-
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
条件分支中的显式删除。