【问题标题】:SQL Remove All Constraints Azure FriendlySQL 删除所有约束 Azure 友好
【发布时间】:2015-07-03 06:47:28
【问题描述】:

我正在使用 Azure 数据库执行一些 DB Admin,我需要执行查询,例如删除数据库中的所有约束。

在使用 Azure 数据库时,sp_MSForEachTable 不可用,因此我正在研究一种不同的方法。

我发现了一个 sn-p,它在这里删除了所有表:http://edspencer.me.uk/2013/02/25/drop-all-tables-in-a-sql-server-database-azure-friendly/ 并尝试修改它以删除我需要的所有约束,并得出了这个结果:

while(exists(select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME != '__MigrationHistory'))
begin
    PRINT ('Disabling' + TABLE_NAME)
    declare @constraintOff nvarchar(2000)
    SELECT TOP 1 @constraintOff=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] ' + 'NOCHECK CONSTRAINT all')
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME != '__MigrationHistory'
    exec (@constraintOff)
    PRINT @constraintOff
end

它反复尝试对数据库中的第一项进行操作,如果您要删除所有内容,这将正常工作,但我需要像 sp_MSForEachTable 那样循环遍历每个表并禁用其约束。

有什么建议吗?我在这里和那里看到过一些声称可以做到这一点的东西,但它们通常是两三页长的脚本,会做很多其他事情,它们让我的大脑受伤。

更新

仍在处理该查询,似乎为此目的可能会更好,但仍然没有骰子:

declare @constraintOff nvarchar(2000)
SELECT @constraintOff=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] ' + 'NOCHECK CONSTRAINT all')
FROM INFORMATION_SCHEMA.TABLES
exec (@constraintOff)
PRINT @constraintOff

这个仍然只在一张桌子上运行,但至少它不是一个无限循环:)

【问题讨论】:

  • 我知道这是针对 Amazon RDS 的,但有一个关于禁用约束的部分:docs.aws.amazon.com/AmazonRDS/latest/UserGuide/… 可能有用。
  • 这正是医生所要求的,有特定的 sn-ps 用于添加和删除所有约束,如果您将带有该链接的那些放入帖子中,我会将其标记为答案

标签: sql tsql azure azure-sql-database


【解决方案1】:

虽然此链接适用于 Amazon RDS,但它确实提供了在没有 sp_MSForEachTable 的情况下禁用约束的特定代码

Importing and Exporting SQL Server Data

-- Manually specify database name - a safeguard in case you paste this into the wrong SSMS window.
USE [staging]

-- Change this line if you want to enable (1) or disable constraints:
DECLARE @enable_constraints bit = 0

--Don't change anything below this line.
DECLARE @schema_name SYSNAME
DECLARE @table_name  SYSNAME

DECLARE table_cursor CURSOR FOR
SELECT
    schemas.name,
    tables.name
FROM
    sys.tables
    INNER JOIN sys.schemas ON tables.schema_id = schemas.schema_id

OPEN table_cursor
FETCH NEXT FROM table_cursor INTO @schema_name, @table_name

DECLARE @cmd varchar(200) 
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @cmd = 'ALTER TABLE ' + QUOTENAME(@schema_name) + '.' + QUOTENAME(@table_name) + ' '
    SET @cmd = @cmd + (CASE WHEN @enable_constraints = 1 THEN 'CHECK' ELSE 'NOCHECK' END) + ' CONSTRAINT ALL'

    PRINT @cmd
    EXEC( @cmd )

    FETCH NEXT FROM table_cursor INTO @schema_name, @table_name
END

CLOSE table_cursor
DEALLOCATE table_cursor

【讨论】:

  • 要禁用它应该是SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@table_name)+' WITH NO CHECK CONSTRAINT ALL'; 并且要重新启用它应该是:SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@table_name)+' WITH CHECK CHECK CONSTRAINT ALL';
  • 其实更正。禁用代码不需要“WITH”。重新启用确实如此。
  • NO CHECK 应该是一个字:SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@table_name)+' NOCHECK CONSTRAINT ALL';
  • 并重新启用检查?
【解决方案2】:

扩展脚本以处理不同模式中的表,还更正了上述未禁用检查的脚本:

    -- DISABLE ALL CONSTRAINTS 
DECLARE @table_name SYSNAME;
DECLARE @schema_name SYSNAME;
DECLARE @cmd NVARCHAR(MAX);
DECLARE table_cursor CURSOR FOR
    SELECT s.name, t.name 
    FROM sys.tables t
    join sys.schemas s on t.schema_id = s.schema_id

OPEN table_cursor;
FETCH NEXT FROM table_cursor INTO @schema_name, @table_name;

WHILE @@FETCH_STATUS = 0 BEGIN
  SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@schema_name)+'.'+QUOTENAME(@table_name)+' NOCHECK CONSTRAINT ALL';
  EXEC (@cmd);
  FETCH NEXT FROM table_cursor INTO  @schema_name, @table_name;
END

CLOSE table_cursor;
DEALLOCATE table_cursor;


-- enable all constraints
DECLARE table_cursor CURSOR FOR
    SELECT s.name, t.name 
    FROM sys.tables t
    join sys.schemas s on t.schema_id = s.schema_id

OPEN table_cursor;
FETCH NEXT FROM table_cursor INTO @schema_name, @table_name;

WHILE @@FETCH_STATUS = 0 BEGIN
  SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@schema_name)+'.'+QUOTENAME(@table_name)+' CHECK CONSTRAINT ALL';
  EXEC (@cmd);
  FETCH NEXT FROM table_cursor INTO  @schema_name, @table_name;
END

CLOSE table_cursor;
DEALLOCATE table_cursor;

【讨论】:

    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多