我正在使用现有的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的数据库上运行此命令会导致类似
的错误第3级第1线第3行3865消息
对象'FK__DocumentS__paren__3A69DAC6'上的操作被阻止。该对象是Filetable系统定义的对象,不允许用户修改。消息3727,级别16,状态0,第3行
无法删除约束。查看以前的错误。