我希望看到所有表和列的列表,这些表和列通过缺少ON DELETE = CASCADE设置的外键约束(直接或间接)引用“主”表中的特定列。
棘手的部分是,在最多5层深处存在间接关系。 (例如:...曾孙子 - > FK3 =>孙子=> FK2 =>孩子=> FK1 =>主表)。我们需要挖掘叶子表 - 列,而不仅仅是第一级。关于这一点的“好”部分是执行速度不受关注,它将在生产数据库的备份副本上运行,以修复未来的任何关系问题。
我做了SELECT * FROM sys.foreign_keys
但是这给了我约束的名称 - 而不是子父母表的名称和列< / strong>在关系中(多汁的位)。此外,之前的设计师使用FK约束的简短,非描述性/随机名称,与我们下面的做法不同
我们在SQL Server中添加约束的方式:
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
this SO question中的评论启发了这个问题。
答案 0 :(得分:1)
我自己的一个更聪明的版本偶然发现了我自己的好奇,年轻版本的问题。答案是
EXEC sp_fkeys 'Users'
希望我在本周能够在未来几年内有更多的智慧消息,从而在40多年后下降:)