代码之家  ›  专栏  ›  技术社区  ›  Mike_G

在删除时层叠还是使用触发器?

  •  11
  • Mike_G  · 技术社区  · 15 年前

    我正在进行一个我接手的项目,在数据库方面,我注意到以前的程序员编写了一系列触发器来删除子记录。问题是,这些记录已经与我要删除的父记录具有外键关系。删除触发器只是子记录的简单删除语句。

    写一个触发器来删除子记录是否有好处,或者我可以将其更改为在删除时层叠并保持良好吗?

    我正在使用MSSQL2008。

    4 回复  |  直到 15 年前
        1
  •  15
  •   MatBailie    15 年前

    级联删除 在MSSQL中,服务器只能级联到单个表。如果有两个表与维度表具有外键关系,则只能将删除级联到其中一个表。(这是为了防止通过多个路径级联,并创建冲突,就像C++允许多重继承,但C.*只允许单继承)。

    在这种情况下,您必须使用触发器或在代码中专门处理这种情况。

    出于这个原因,我看到许多人在所有情况下都选择使用触发器。即使只有一张外国桌子。这确保了一致性,因此人们知道在维护数据库时要寻找什么。

    如果可以将一个删除级联到多个表,我会说这是最可取的选择。然而,这种限制使水变得浑浊,我目前更倾向于拥有所有此类行为的触发器。使用触发器进行级联删除和更新的开销在编码方面只是很小的,但允许真正通用的标准实践。

    编辑:

    你可能想把“接受的答案”转移到别人身上,我已经知道我错了。

    您可以让多个事实数据表具有对一个可签名维度表的删除级联外键约束。

    您不能做的是让一个事实表具有对多个维度表的删除级联外键约束。

    例如…
    -维度表[人](id int identity,)
    -维度表[检查](ID int标识,)
    -面表[考试成绩](个人成绩,考试成绩,成绩)

    如果删除了个人或考试,您还需要删除相关的考试分数记录。

    在MS SQL Server中不能使用on delete cascade,因此需要触发器。

    (向试图向我解释这一点但我完全没有理解他的观点的迈尔达道歉。)

        2
  •  10
  •   Mehrdad Afshari    15 年前

    远离不必要的触发。

    一起去 ON DELETE CASCADE 如果你只需要这么做。

        3
  •  1
  •   James Black    15 年前

    我会在删除时使用cascade,但是只有当您确定要删除父级时才使用cascade。

    如果您有任何条件逻辑(如果在星期日删除,我只删除子级),那么使用触发器。

    我就把它换成 cascade on delete 在一个开发系统上,然后运行我的单元测试并确保没有任何中断。

        4
  •  1
  •   onedaywhen    15 年前

    我几乎同意这里的DEMS,除了我使用 ON DELETE CASCADE (和) ON UPDATE CASCADE 为此)尽可能地引用操作,并且仅在必要时使用触发器。我还考虑从表中撤销权限,并强制使用“helper”存储过程进行删除和更新。

    称我为乐观主义者,但我相信a)我的代码将在移植到未来版本的MS SQL Server后仍然有效;b)SQL Server团队将很快着手解决“一个级联路径”的限制,在这一点上,我将用级联引用操作替换触发器:)