SQL Server 2014删除指定前缀表遇外键约束,求删除约束方法
解决SQL Server批量删除带前缀表(含约束)的问题
你之前用EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'没效果的核心原因是:这个操作只是禁用了约束的检查逻辑,并没有删除约束本身。当你要删除被其他表外键引用的表时,数据库依然会因为存在引用关系而阻止删除。
要彻底解决这个问题,得先批量清除所有和目标表(带myprefix前缀)相关的外键约束,再删除表。具体步骤如下:
1. 生成并执行删除外键约束的脚本
运行以下SQL,会自动生成所有需要删除的外键语句:
-- 生成删除其他表引用目标表的外键语句 SELECT 'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(fk.parent_object_id)) + '.' + QUOTENAME(OBJECT_NAME(fk.parent_object_id)) + ' DROP CONSTRAINT ' + QUOTENAME(fk.name) + ';' FROM sys.foreign_keys fk JOIN sys.tables t ON fk.referenced_object_id = t.object_id WHERE t.name LIKE 'myprefix%' UNION ALL -- 生成删除目标表自身外键的语句 SELECT 'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(fk.parent_object_id)) + '.' + QUOTENAME(OBJECT_NAME(fk.parent_object_id)) + ' DROP CONSTRAINT ' + QUOTENAME(fk.name) + ';' FROM sys.foreign_keys fk JOIN sys.tables t ON fk.parent_object_id = t.object_id WHERE t.name LIKE 'myprefix%'
把查询结果复制出来,执行这些ALTER TABLE DROP CONSTRAINT语句,就能清除所有和目标表相关的外键约束。
2. 生成并执行删除表的脚本
约束清理完成后,运行下面的脚本生成删除表的语句:
SELECT 'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + '.' + QUOTENAME(t.name) + ';' FROM sys.tables t WHERE t.name LIKE 'myprefix%'
执行生成的DROP TABLE语句,就能顺利删除所有带前缀的表了。
3. 重建约束
因为你已经有约束重建脚本,直接执行它就能恢复所有需要的约束。
内容的提问来源于stack exchange,提问作者Aspiring Dev 23000
相关产品推荐
相关产品推荐

