AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 320345
Accepted
omerix
omerix
Asked: 2022-11-30 08:31:26 +0800 CST2022-11-30 08:31:26 +0800 CST 2022-11-30 08:31:26 +0800 CST

如果删除记录时检查符合要求,我确实要删除它

  • 772

我有一张桌子。我的表中有一个字段显示“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个

小提琴

sql-server
  • 1 1 个回答
  • 28 Views

1 个回答

  • Voted
  1. Best Answer
    Peter
    2022-11-30T09:38:36+08:002022-11-30T09:38:36+08:00

    在 INSTEAD 触发器中,您还需要删除记录,因为触发器会代替删除操作。请参见下面的示例:

    CREATE TRIGGER MyTable_Trigger_Delete
    ON dbo.MyTable
    INSTEAD OF DELETE
    AS
    BEGIN
    
        IF EXISTS (SELECT 1 FROM deleted WHERE islocked = 1)
        BEGIN
            RAISERROR('You cannot delete a locked recording.', 16, 1);
            ROLLBACK TRANSACTION;
        END;
        ELSE
        BEGIN
            /*we now can delete the rows*/
            DELETE t
            FROM dbo.MyTable t
                JOIN Deleted AS d
                    ON d.Name = t.Name
                       AND d.City = t.City
                       AND d.Date = t.Date
                       AND d.Value = t.Value;
        END;
    
    END;
    

    此外,在您的示例中,您没有指定主键。我建议你这样做 ;-)

    请注意,当部分记录被锁定时,记录不会被删除。如果你还想删除那些你应该像这样编辑你的触发器:

    CREATE OR ALTER TRIGGER MyTable_Trigger_Delete
    ON dbo.MyTable
    INSTEAD OF DELETE
    AS
    BEGIN
    
        IF EXISTS (SELECT 1 FROM deleted WHERE islocked = 1)
        BEGIN
            RAISERROR('You cannot delete a locked recording.', 16, 1);
        END;
        
        
            /*we now can delete the rows which are not locked*/
            DELETE t
            FROM dbo.MyTable t
                JOIN Deleted AS d
                    ON d.Name = t.Name
                       AND d.City = t.City
                       AND d.Date = t.Date
                       AND d.Value = t.Value
                       AND t.islocked = 0
        
    
    END;
    
    • 3

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve