我有一张桌子。我的表中有一个字段显示“islocked”记录已锁定。此字段数可以超过一个。isApproved, isAccepted 等
有各种触发器(删除后等)。触发器内部运行着程序。
程序内部,有逐条删除的操作,也有批量删除的操作。
如果记录被锁定,用户要求我防止删除。
我不想在后触发器中编码,而是想用它之前的“INSTEAD OF DELETE”触发器来完成。
但是它说记录已删除。它没有被删除。
永远不会删除多个记录。
如果批量删除中有锁定和解锁的记录,也不起作用。
我哪里做错了?
同时,如果这个触发器出错,我希望其他触发器根本不起作用。可以优先考虑吗?
CREATE TABLE [dbo].[MyTable](
[name] [varchar](50) NULL,
[city] [varchar](50) NULL,
[date] [date] NULL,
[value] [int] NULL,
[islocked] [int] NULL
) ON [PRIMARY]
INSERT [dbo].[MyTable] ([name], [city], [date], [value], [islocked]) VALUES (N'John', N'Berlin', CAST(N'2022-01-02' AS Date), 10, 0)
INSERT [dbo].[MyTable] ([name], [city], [date], [value], [islocked]) VALUES (N'Marty', N'Istanbul', CAST(N'2022-01-03' AS Date), 20, 1)
INSERT [dbo].[MyTable] ([name], [city], [date], [value], [islocked]) VALUES (N'Aila', N'Washington', CAST(N'2022-01-05' AS Date), 30, 0)
INSERT [dbo].[MyTable] ([name], [city], [date], [value], [islocked]) VALUES (N'Aise', N'Moskova', CAST(N'2022-01-01' AS Date), 40, 1)
create TRIGGER MyTable_Trigger_Delete ON dbo.MyTable
INSTEAD OF DELETE AS
BEGIN
IF ((SELECT COUNT(*) FROM DELETED WHERE islocked=1)>0)
BEGIN
RAISERROR ('You cannot delete a locked recording.', 16, 1)
ROLLBACK TRANSACTION
END
END
select * from MyTable
姓名 | 城市 | 日期 | 价值 | 被锁住了 |
---|---|---|---|---|
约翰 | 柏林 | 2022-01-02 | 10 | 0 |
马蒂 | 伊斯坦布尔 | 2022-01-03 | 20 | 1个 |
艾拉 | 华盛顿 | 2022-01-05 | 30 | 0 |
爱色 | 莫斯科娃 | 2022-01-01 | 40 | 1个 |
select * from MyTable where (city='Istanbul' OR city='Berlin')
姓名 | 城市 | 日期 | 价值 | 被锁住了 |
---|---|---|---|---|
约翰 | 柏林 | 2022-01-02 | 10 | 0 |
马蒂 | 伊斯坦布尔 | 2022-01-03 | 20 | 1个 |
delete from MyTable where (city='Istanbul' OR city='Berlin')
Msg 50000 Level 16 State 1 Line 9
You cannot delete a locked recording.
Msg 3609 Level 16 State 1 Line 1
The transaction ended in the trigger. The batch has been aborted.
select * from MyTable
姓名 | 城市 | 日期 | 价值 | 被锁住了 |
---|---|---|---|---|
约翰 | 柏林 | 2022-01-02 | 10 | 0 |
马蒂 | 伊斯坦布尔 | 2022-01-03 | 20 | 1个 |
艾拉 | 华盛顿 | 2022-01-05 | 30 | 0 |
爱色 | 莫斯科娃 | 2022-01-01 | 40 | 1个 |
delete from MyTable where city='Berlin'
1 rows affected
select * from MyTable
姓名 | 城市 | 日期 | 价值 | 被锁住了 |
---|---|---|---|---|
约翰 | 柏林 | 2022-01-02 | 10 | 0 |
马蒂 | 伊斯坦布尔 | 2022-01-03 | 20 | 1个 |
艾拉 | 华盛顿 | 2022-01-05 | 30 | 0 |
爱色 | 莫斯科娃 | 2022-01-01 | 40 | 1个 |
在 INSTEAD 触发器中,您还需要删除记录,因为触发器会代替删除操作。请参见下面的示例:
此外,在您的示例中,您没有指定主键。我建议你这样做 ;-)
请注意,当部分记录被锁定时,记录不会被删除。如果你还想删除那些你应该像这样编辑你的触发器: