【问题标题】:Update table after delete using trigger使用触发器删除后更新表
【发布时间】:2021-03-16 18:52:55
【问题描述】:

正如标题所述,当从 Table1 中删除一行时,我正在尝试使用触发器来更新 Table2 中的值。我的代码如下所示:

CREATE TRIGGER TRG_Table1_DEL
    ON Table1
    FOR DELETE
AS
    UPDATE Table2 SET
        FK_Table1ID = NULL
    WHERE FK_Table1ID = (SELECT Table1ID FROM DELETED)
  • 我遇到的第一个错误是 UPDATE 命令,它指出: “'UPDATE' 附近的语法不正确。需要 EXTERNAL。
  • 第二个错误 与我要访问的 DELETED 表一起使用。这说明 "无效的对象名称'DELETED'。

总的来说,我只是想模仿一个将列设置为空的约束(ON DELETE SET NULL)。我这样做是因为我收到一条错误消息,提示我在尝试添加约束时可能会导致多个循环或级联路径。

对于我的代码,我基于this 答案。

【问题讨论】:

  • 请注意,您需要处理Deleted 可能有多行的事实,即这个WHERE FK_Table1ID = (SELECT Table1ID FROM DELETED) 应该是这个WHERE FK_Table1ID IN (SELECT Table1ID FROM DELETED)
  • 您可能还应该将SET NOCOUNT ON;IF(NOT EXISTS(SELECT 1 FROM deleted)) RETURN; 添加到触发器中。小提示:如果您有 FK 循环,则很有可能您的数据库设计有问题。并非总是如此,只是需要考虑一下。
  • 我不明白您如何使用您向我们展示的代码获得第一个错误。你确定这是整个代码吗?

标签: sql sql-server triggers sql-update constraints


【解决方案1】:

这应该可以在 SQL Server 中使用。我刚刚将 (=) 替换为 (in)。

CREATE TRIGGER TRG_Table1_DEL
ON Table1
FOR DELETE
AS
    UPDATE Table2 
    SET FK_Table1ID = NULL 
    WHERE FK_Table1ID IN (SELECT Table1ID FROM DELETED)

示例:

 create table empsalary(empid int, month int , salary int);

 insert into empsalary values(1, 1, 100);
 insert into empsalary values(1, 2, 101);
 insert into empsalary values(1, 3, 103);

 create table emp(empid int, id int);

 insert into emp values(1,1);


CREATE TRIGGER TRG_Table1_DEL
ON empsalary
FOR DELETE
AS
    UPDATE emp 
    SET id = NULL 
    WHERE empid IN (SELECT empid FROM DELETED)
     

 select  * from empsalary
empid month salary
1 1 100
1 2 101
1 3 103
 select  * from emp
empid id
1 1
 delete empsalary where month=1;

 select * from empsalary;
empid month salary
1 2 101
1 3 103
 select  *from emp;
empid id
1 null

db小提琴here

【讨论】:

    【解决方案2】:

    这个问题原来有一个非常简单的解决方法。我收到错误是因为我试图在删除约束后添加触发器。这很好,但是我忘记在删除约束和创建触发器之间添加一个 GO 命令。我的代码如下所示:

    DROP CONSTRAINT
    ADD TRIGGER
    

    但这是正确的解决方案:

    DROP CONSTRAINT
    GO
    ADD TRIGGER
    

    编辑:正如DaleK 所指出的,我还需要修改 WHERE 子句以防 DELETED 表有多行

    【讨论】:

    • 不过,请确保对 =IN 问题进行排序。
    • 但如果有机会一次删除多行,则需要修改where子句中的条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多