如何删除SQL Server表列表,忽略约束?

pftdvrlh  于 2023-01-25  发布在  SQL Server
关注(0)|答案(7)|浏览(141)

我有一个包含六个MSSQL 2008表的列表,我希望立即从数据库中删除这些表。数据已全部迁移到新表中。new 表中没有对 old 表的引用。
问题是旧表带有由工具(实际上是aspnet_regsql)自动生成的内部FK约束负载,因此手动删除所有约束是一件真实的痛苦的事情。
如何删除旧表而忽略所有内部约束?

rqcrx0a6

rqcrx0a61#

这取决于你想如何删除表。如果表列表需要删除覆盖几乎超过20%的表在您的数据库。
然后,我将在我的脚本下禁用该DB中的所有约束,并在同一脚本下删除表和Enable约束。

--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'

最后,检查约束的状态,启动此查询。

--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

如果不想在数据库级别禁用约束,请列出要删除的表。
步骤1:检查与这些表关联的约束

SELECT * 
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('dbo.Tablename')

步骤2:禁用与这些表关联的约束。

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint

步骤3:删除表

DROP TABLE TABLENAME
nimxete2

nimxete22#

一个简单的DROP TABLE dbo.MyTable将忽略所有的约束(和触发器),除了外键(除非您先删除子表/引用表),您可能必须先删除这些。
编辑:评论后:
没有自动的方法,您必须迭代sys.foreign_keys并生成一些ALTER TABLE语句。

qpgpyjmq

qpgpyjmq3#

运行以下脚本删除当前DB下所有表中的所有约束,然后运行drop table语句。

DECLARE @dropAllConstraints NVARCHAR(MAX) = N'';

SELECT @dropAllConstraints  += N'
ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))
    + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + 
    ' DROP CONSTRAINT ' + QUOTENAME(name) + ';'
FROM sys.foreign_keys;
EXEC sp_executesql @dropAllConstraints
ymdaylpp

ymdaylpp4#

我找到了一个合理的方法,让SQL编写SQL来删除约束:

select concat("alter table ", table_name, " drop ", constraint_type ," ", constraint_name, ";")
  from information_schema.table_constraints 
  where table_name like 'somefoo_%' 
        and 
        constraint_type <> "PRIMARY KEY";

您可能需要修改表名以满足自己的需要,或者可能需要根据其他列/值进行选择。
而且,这将选择任何非主键约束,这可能是一个太大的大锤。也许你需要只是设置为=?
我不是DBA。可能有更好的方法来做到这一点,但它对我的目的来说已经足够好了。

aurhwmvo

aurhwmvo5#

我终于找到了基于script provided by Jason Presley的解决方案。这个脚本自动删除DB中的所有约束。添加WHERE子句很容易,这样它就只应用于相关的表集。之后,删除所有表就很简单了。

jei2mxaa

jei2mxaa6#

使用下面的脚本时要非常小心,数据库中的所有表、视图、函数、存储过程和用户定义的类型都要忽略所有约束。

/*
  Description: This script will remove all tables, views, functions, stored procedures and user defined types from a database.
*/
        declare @n char(1)
        set @n = char(10)

        declare @stmt nvarchar(max)

        -- procedures
        select @stmt = isnull( @stmt + @n, '' ) +
        'drop procedure [' + schema_name(schema_id) + '].[' + name + ']'
        from sys.procedures

        -- check constraints
        select @stmt = isnull( @stmt + @n, '' ) +
        'alter table [' + schema_name(schema_id) + '].[' + object_name( parent_object_id ) + ']    drop constraint [' + name + ']'
        from sys.check_constraints

        -- functions
        select @stmt = isnull( @stmt + @n, '' ) +
        'drop function [' + schema_name(schema_id) + '].[' + name + ']'
        from sys.objects
        where type in ( 'FN', 'IF', 'TF' )

        -- views
        select @stmt = isnull( @stmt + @n, '' ) +
        'drop view [' + schema_name(schema_id) + '].[' + name + ']'
        from sys.views

        -- foreign keys
        select @stmt = isnull( @stmt + @n, '' ) +
        'alter table [' + schema_name(schema_id) + '].[' + object_name( parent_object_id ) + '] drop constraint [' + name + ']'
        from sys.foreign_keys

        -- tables
        select @stmt = isnull( @stmt + @n, '' ) +
        'drop table [' + schema_name(schema_id) + '].[' + name + ']'
        from sys.tables

        -- user defined types
        select @stmt = isnull( @stmt + @n, '' ) +
        'drop type [' + schema_name(schema_id) + '].[' + name + ']'
        from sys.types
        where is_user_defined = 1

        exec sp_executesql @stmt
vaj7vani

vaj7vani7#

我猜想您必须在删除之前对有问题的表执行“alter”命令,以删除forigen键约束。

ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders;
DROP TABLE Orders;

当然,如果您先删除子表,那么就不会有这个问题。(除非您有表A对表B的约束,以及表B对表A的约束,那么您将需要修改其中一个表,例如A以删除约束)
例如,此WONT工作,因为订单具有来自Order_Lines的约束

DROP TABLE Orders;
DROP TABLE Order_lines;

这将起作用

DROP TABLE Order_lines;
DROP TABLE Orders;

相关问题