【发布时间】:2019-11-05 18:59:35
【问题描述】:
我正在使用现有的 SQL 脚本,该脚本会从数据库中删除所有外键。如果其中一张表是FileTable,则会遇到麻烦。
主要问题:有没有办法检测特定表是FILETABLE 并跳过删除该表上的外键?
如果可能的话:是否也可以通过区分系统外键和自定义外键来获得更细化并从FILETABLE 中删除任何非系统生成的外键?
DECLARE @fkdel varchar(512);
DECLARE FkCrsr CURSOR FOR
SELECT 'ALTER TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME +']'
FROM information_schema.table_constraints WITH (NOLOCK)
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY';
OPEN FkCrsr;
FETCH NEXT FROM FkCrsr INTO @fkdel;
WHILE @@FETCH_STATUS = 0
BEGIN;
PRINT @fkdel;
EXEC (@fkdel);
FETCH NEXT FROM FkCrsr INTO @fkdel;
END;
CLOSE FkCrsr;
DEALLOCATE FkCrsr;
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";
在包含 FileTable 的数据库上运行它会导致类似
的错误消息 3865,第 16 级,状态 1,第 3 行
对象“FK__DocumentS__paren__3A69DAC6”的操作被阻止。该对象是 FileTable 系统定义的对象,不允许用户修改。消息 3727,第 16 级,状态 0,第 3 行
无法删除约束。查看以前的错误。
【问题讨论】:
标签: sql-server database tsql foreign-keys filetable