ON DELETE CASCADE
假设我有许多由外键链链接的表。据我所知和经验,从一张表中删除根本不会让我注意到我实际上影响了多个表。例如,如果删除一行导致table1
删除 500 行,table2
那么 SSMS 会告诉我的是
(1 行受影响)
有什么方法可以知道我DELETE
实际更改了多少表/行?从理论上讲,似乎我可以从一个足够邪恶的数据库中的一个表中删除一行,并在不知不觉中删除该数据库 99% 的数据。
ON DELETE CASCADE
假设我有许多由外键链链接的表。据我所知和经验,从一张表中删除根本不会让我注意到我实际上影响了多个表。例如,如果删除一行导致table1
删除 500 行,table2
那么 SSMS 会告诉我的是
(1 行受影响)
有什么方法可以知道我DELETE
实际更改了多少表/行?从理论上讲,似乎我可以从一个足够邪恶的数据库中的一个表中删除一行,并在不知不觉中删除该数据库 99% 的数据。
如果您只是一般好奇,请查看查询计划。它将显示所有涉及的表。
如果您想要记录或审核它们,那就是另一回事了。您需要使用触发器或某些品牌的审核。
您可以从实际查询计划中获取此信息。
如果您想解析查询计划以找出实际影响了多少行,您可以这样做。
数据库<>小提琴
如果您想知道哪些表可能会因删除某个表而受到影响,则可以对系统目录使用以下查询。
完全正确。
我们数据库面临的最大威胁之一是“哎呀!” 片刻。
例如,某人/某物发出错误的 SQL 代码,导致灾难(如果你幸运的话;至少很容易发现)或持续/渐进的“怪异”系统行为(可能性更大)。意外删除财务系统“顶部”的“公司”记录(从而有效地“删除”整个公司的财务)可能会被归类为“糟糕!” 时刻(尽管在英国,我们可能称其为“P45”时刻)。
外键可以保护您的数据。
比如说,为了保证每个订单行都有一个父订单。
恕我直言,事实上这些 SQL 结构也具有更改或删除相关数据的能力,这是一个错误。
主键永远不应该改变。
它们应该在第一次创建记录时分配/生成,并且应该保持不变,直到该记录最终永久销毁。如果是这样的话,为什么需要“ ON UPDATE CASCADE”?
应控制数据的破坏。
正如您所建议的,“嵌套”级联可能会造成巨大的损害,导致系统中断,您必须执行数据库灾难恢复计划,等等。它影响很大,而且价格昂贵。
那么“ON CASCADE DELETE”真的是个好主意吗?
现在,好吧,您可能想要将其应用到一些“不太重要”的表,但这需要是一个有意识的决定,是在讨论并同意这确实是管理这些表的最佳方式之后达成的。
默认情况下,任何在外键子句上放置“ON ... CASCADE”子句的人都只是用炸药加载他们的数据库。