【问题标题】:Help on SQL Server triggerSQL Server 触发器帮助
【发布时间】:2011-06-07 02:10:12
【问题描述】:

假设我有 3 张桌子

t1

Nid   name
1    aaa
2    bbb
3    ccc

delT1

Nid    name

t2

Sid    Nid     value
1      1       AAA
2      1       BAC
3      2       CSA

在表中t1Nid是主键,是t2的外键

现在我想要的是,当我从 t1 中删除值时,它会自动删除 t2 中的所有值,其中 t1.Nid=t2.Nid 和已删除的 t1 值被插入到 delT1

如何为此类任务创建触发器?

请帮助我,因为我是 sql 新手

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:

    正常的触发器不起作用:外键会在代码运行之前出错。

    你可以做的是在你的外键上设置一个CASCADE,这样T1中的删除就会自动从T2中删除。

    就我个人而言,我会先使用存储过程和事务从 T2 中删除,然后再从 T1 中删除。

    【讨论】:

    • 好电话,我没有想通发帖人实际上试图完成什么以及抛出错误的约束
    • @lazyDBA:是的,很容易被遗忘。而且你知道,我不记得之前/INSTEAD OF 触发器是否可以工作...... ;)
    【解决方案2】:

    修改T2中的FK为ON DELETE CASCADE

    ALTER TABLE T2 DROP CONSTRAINT FK_T1_Nid; <-- your constraint name here
    ALTER TABLE T2 ADD CONSTRAINT FK_T1_Nid FOREIGN KEY (Nid)
       REFERENCES T1 (Nid) ON DELETE CASCADE;
    

    然后在T1上创建一个触发器,将信息推送到delT1:

    CREATE TRIGGER TR_T1_D ON T1 FOR DELETE
    AS
    SET NOCOUNT ON;
    INSERT delT1
    SELECT Nid, Name
    FROM Deleted;
    

    请注意,此触发器会阻止您在针对 T1 的 DELETE 上使用 OUTPUT 子句。 BOL says:

    如果指定了 OUTPUT 子句但没有指定 INTO 关键字,则 DML 操作的目标不能为给定的 DML 操作定义任何启用的触发器。例如,如果在 UPDATE 语句中定义了 OUTPUT 子句,则目标表不能有任何启用的 UPDATE 触发器。

    【讨论】:

    • @gbn 是的,在右侧丢失文本是个问题,尤其是在移动设备上。
    【解决方案3】:

    @gbn 有首选的方法。由于您要求触发器,因此您可以这样做以进行比较:

    CREATE TRIGGER t1_Delete ON t1
    INSTEAD OF DELETE AS BEGIN SET NOCOUNT ON;
      INSERT INTO delT1 (Nid, name)
      SELECT Nid, name
      FROM DELETED;
    
      DELETE FROM t2
      WHERE t2.Nid IN (SELECT Nid FROM DELETED);
    
      DELETE FROM t1
      WHERE t1.Nid IN (SELECT Nid FROM DELETED);
    END;
    

    【讨论】:

    • 您忘记添加INSERT INTO delT1 ...
    • @Andriy M - 是的,我确实做到了 - 谢谢。编辑以包含 delT1 表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多