Joa*_*rel 14 sql sql-server sql-server-2008 sql-drop
我有一个包含6个MSSQL 2008表的列表,我想从我的数据库中一次删除.数据已完全迁移到新表.新表中没有引用旧表.
问题是旧表带有大量内部FK约束,这些约束已由工具自动生成(实际上是aspnet_regsql).因此,手动删除所有约束是一个真正的痛苦.
如何忽略所有内部约束而丢弃旧表?
小智 6
这取决于你想如何删除表.如果表的列表需要覆盖几乎超过数据库下表的20%.
然后我将在我的脚本下禁用该DB中的所有约束,并删除表并在同一脚本下启用约束.
--To Disable a Constraint at DB level
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
--Write the code to DROP tables
DROP TABLE TABLENAME
DROP TABLE TABLENAME
DROP TABLE TABLENAME
--To Enable a Constraint at DB level
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
Run Code Online (Sandbox Code Playgroud)
最后检查你的约束的状态启动这个查询.
--Checks the Status of Constraints
SELECT (CASE
WHEN OBJECTPROPERTY(CONSTID, 'CNSTISDISABLED') = 0 THEN 'ENABLED'
ELSE 'DISABLED'
END) AS STATUS,
OBJECT_NAME(CONSTID) AS CONSTRAINT_NAME,
OBJECT_NAME(FKEYID) AS TABLE_NAME,
COL_NAME(FKEYID, FKEY) AS COLUMN_NAME,
OBJECT_NAME(RKEYID) AS REFERENCED_TABLE_NAME,
COL_NAME(RKEYID, RKEY) AS REFERENCED_COLUMN_NAME
FROM SYSFOREIGNKEYS
ORDER BY TABLE_NAME, CONSTRAINT_NAME,REFERENCED_TABLE_NAME, KEYNO
Run Code Online (Sandbox Code Playgroud)
如果您不想在数据库级别禁用约束,请创建要删除的表的列表.
第1步:检查与thos表关联的约束
SELECT *
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('dbo.Tablename')
Run Code Online (Sandbox Code Playgroud)
步骤2:禁用与这些表关联的约束.
ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint
Run Code Online (Sandbox Code Playgroud)
第3步:删除表格
DROP TABLE TABLENAME
Run Code Online (Sandbox Code Playgroud)
简单的DROP TABLE dbo.MyTable将忽略除外键之外的所有约束(和触发器)(除非您首先删除子表/引用表),您可能必须先删除这些约束。
编辑:评论后:
没有自动的方法。您必须迭代sys.foreign_keys并生成一些 ALTER TABLE 语句。
| 归档时间: |
|
| 查看次数: |
38129 次 |
| 最近记录: |