gpt4 book ai didi

sql-server - 预览具有 ON CASCADE 约束的记录的 SQL DELETE

转载 作者:行者123 更新时间:2023-12-02 10:27:07 24 4
gpt4 key购买 nike

我们有一个主“用户”表和许多个引用 UserId 的表

  • 直接:UserId 是子表中的 FK 或
  • 间接:“孙”表中的另一个 FK 引用子表中的记录,而子表又通过 FK 约束引用 UserID。

现在,如果一切都很完美,删除用户应该就像在主表中删除它们一样简单,并且 ON CASCADE 约束会影响到其余表。问题是我们不能 100% 确定引用的每个表(直接或间接)中的每个 FK 关系是否都具有 ON CASCADE 约束。我们需要某种方法来发出删除操作并观察 SQL Server 实际删除哪些表。我读过this并尝试了它,但它不显示任何级联的表 - 仅显示主表中的条目

这是我尝试过的:

DELETE umt
OUTPUT DELETED.*
FROM [OurAppDb].[dbo].[UserMasterTable] umt
WHERE umt.UserId LIKE 'ABCDABCD-ABCD-ABCD-ABCD-ABCDABCDABCD'

如何查看上述查询将涉及的所有表?

注意:ON CASCADE 约束是数据库中的一个约束,我们认为在构建每个表时为每个 表添加了该约束。将其添加到一张表上的示例

ALTER TABLE [dbo].[UserEmailPrefs]  
WITH CHECK ADD CONSTRAINT [FK_UserEmailPrefs_UserMasterTable_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[UserMasterTable] ([UserId])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[UserEmailPrefs] CHECK CONSTRAINT [FK_UserEmailPrefs_UserMasterTable_UserId]
GO

最佳答案

要检查整个数据库中引用 UserMasterTable 的引用约束,请使用 INFORMATION_SCHEMA View 。

SELECT RC.CONSTRAINT_NAME, TU.TABLE_NAME, RC.DELETE_RULE, RC.UPDATE_RULE 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE TU
ON RC.CONSTRAINT_CATALOG = TU.CONSTRAINT_CATALOG
AND RC.CONSTRAINT_NAME = TU.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.table_constraints TC
ON RC.unique_constraint_name = TC.CONSTRAINT_NAME
WHERE TC.TABLE_NAME='Users'

这将返回针对 UserMasterTable 的引用约束列表,对于每个约束,哪个表正在引用 UserMasterTable,以及 ON DELETE 和 ON UPDATE 规则是什么。由此您可以快速查看哪些引用约束缺少所需的 CASCADE 规则。无需动不动就开枪。

要将其扩展到“孙子”引用,请再添加两个连接子句。要将其扩展到任意数量的级别,请使用递归 CTE。

关于sql-server - 预览具有 ON CASCADE 约束的记录的 SQL DELETE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13534428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com