大量数据的插入和修改可能需要它。
问问题
5184 次
4 回答
11
禁用所有 FK:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
GO
启用所有 FK:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? CHECK CONSTRAINT ALL"
GO
禁用所有触发器:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? DISABLE TRIGGER ALL"
GO
启用所有触发器:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? ENABLE TRIGGER ALL"
GO
当然,请注意,如果您在此之前禁用了任何 FK/触发器,启用脚本将重新启用这些。
于 2013-11-01T14:15:10.647 回答
0
要禁用表中的所有 FK:
ALTER TABLE Table2 NOCHECK CONSTRAINT ALL
要禁用表中的单个 FK:
ALTER TABLE Table2 NOCHECK CONSTRAINT FK_Table2_Table1
要使它们替换NOCHECK
为CHECK
.
于 2013-11-01T14:11:17.703 回答
0
如果要禁用所有 FK,然后将它们恢复到原始状态,可以使用以下方法:
禁用所有约束
If OBJECT_ID('tempdb..#tempConstraints') is not null Drop Table #tempConstraints;
GO
IF (SELECT OBJECT_ID('tempdb..#tmpScriptErrors')) IS NOT NULL DROP TABLE #tmpScriptErrors
GO
CREATE TABLE #tmpScriptErrors (Error int)
GO
Create Table #tempConstraints
(
ConstraintName nVarchar(200),
TableName nVarchar(200),
SchemaName nVarchar(200),
IsNotTrusted bit
);
GO
Begin Tran
Insert into #tempConstraints (ConstraintName, TableName, SchemaName, IsNotTrusted)
Select K.name, object_name(K.parent_object_id), SCHEMA_NAME(T.schema_id), K.Is_Not_Trusted
FROM sys.foreign_keys K
Inner Join sys.tables T on K.parent_object_id = T.object_id
Where is_disabled = 0
Union all
Select K.name, object_name(K.parent_object_id), SCHEMA_NAME(T.schema_id), K.Is_Not_Trusted
from sys.check_constraints K
Inner Join sys.tables T on K.parent_object_id = T.object_id
Where is_disabled = 0
--Disable the Constraints.
Print 'Disabling Constraints'
Exec sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL';
将约束恢复到原始状态
Declare @name nvarchar(200);
Declare @table nvarchar(200);
Declare @schema nvarchar(200);
Declare @script nvarchar(max);
Declare @NotTrusted bit;
Declare constraints_cursor CURSOR FOR
Select ConstraintName, TableName, SchemaName, IsNotTrusted
From #tempConstraints;
Open constraints_cursor;
Fetch Next from constraints_cursor
into @name, @table, @schema, @NotTrusted;
While @@FETCH_STATUS = 0
Begin
--Restore each of the Constraints back to exactly the state they were in prior to disabling.
If @NotTrusted = 1
Set @script = 'ALTER TABLE [' + @schema + '].[' + @table + '] WITH NOCHECK CHECK CONSTRAINT [' + @name + ']';
Else
Set @script = 'ALTER TABLE [' + @schema + '].[' + @table + '] WITH CHECK CHECK CONSTRAINT [' + @name + ']';
exec sp_executesql @script;
If @@ERROR <> 0
Begin
PRINT 'Re-Enabling ' + @name;
INSERT INTO #tmpScriptErrors (Error)
VALUES (1);
End
Fetch Next from constraints_cursor
into @name, @table, @schema, @NotTrusted;
End
Close constraints_cursor;
Deallocate constraints_cursor;
If exists (Select 'x' from #tmpScriptErrors)
ROLLBACK TRAN;
Else
COMMIT TRAN;
Drop table #tmpScriptErrors
GO
Drop table #tempConstraints
GO
于 2013-11-01T15:39:37.960 回答
-1
在单个语句中禁用触发器
DISABLE TRIGGER
-ENABLE TRIGGER
检查 MSDN 的语法。例如,在 google 上搜索:DISABLE TRIGGER t-sql
例如,在所有服务器上禁用全部触发;-- 禁用所有在服务器级别定义的 DML 触发器和所有登录触发器
没有内置方法可以在单个语句中禁用所有 FK。
于 2013-11-01T13:46:39.097 回答