Использование sp_msforeachtable запускает операторы последовательно. Скорее всего, распределение по нескольким потокам значительно ускорит процесс. С помощью Service Broker это можно сделать в коде SQL.
(Ниже приведен код, написанный из памяти, у меня нет SQL Server, доступного для проверки этого. Поэтому в нем могут быть некоторые ошибки. Я буду обновлять всякий раз, когда у меня будет доступен сервер.)
Сначала создайте процедуру активации
CREATE PROC p_enable_constraints
AS
DECLARE @handle UNIQUEIDENTIFIER
, @message sysname
, @sql nvarchar(max)
WHILE 1=1
BEGIN
BEGIN TRAN
WAITFOR ( RECEIVE TOP(1) @handle = conversation_handle,
@message = message_body
FROM ConstraintQueueReceive), TIMEOUT 1000;
IF @@rowcount = 0
begin
rollback
break;
end
set @sql = N'ALTER TABLE ' + quotename(@message) + N' WITH CHECK CONSTRAINT ALL'
exec (@sql)
if @@error <> 0
begin
rollback tran
break
end
COMMIT TRANSACTION
END
RETURN(0)
GO
Настройка очередей и служб для отправки и получения сообщений
CREATE QUEUE ConstraintQueueSend
CREATE SERVICE ConstraintServiceSend
CREATE QUEUE ConstraintQueueReceive
WITH STATUS = ON, ACTIVATION (PROCEDURE_NAME = p_enable_constraints
, MAX_QUEUE_READERS = 8
, EXECUTE AS SELF);
CREATE SERVICE [ConstraintServiceReceive] ON QUEUE ConstraintQueueReceive
Теперь создайте процедуру для отправки сообщения для каждой таблицы
CREATE PROC p_submit_enable_constraints_message @object sysname
AS
DECLARE @handle UNIQUEIDENTIFIER;
DECLARE @message sysname;
BEGIN TRANSACTION;
BEGIN DIALOG @handle FROM SERVICE [ConstraintServiceSend]
TO SERVICE [ConstraintServiceReceive]
WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @handle (@object);
COMMIT TRANSACTION;
END CONVERSATION @handle
GO
Наконец, мы можем вызвать процедуру для отправки этого в очередь.
EXEC sp_msforeachtable 'EXEC p_submit_enable_constraints_message N''?'''
В идеале результат таблицы изменений будет захвачен и отправлен обратно.