【发布时间】: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