zinal: (default)
Maksim Zinal ([personal profile] zinal) wrote2016-11-28 05:55 pm
Entry tags:

Включение и выключение ограничений целостности для всех таблиц MSSQL

При пакетном переносе данных между базами Microsoft SQL Server и в ряде других сценариев (например, при загрузке замаскированной/обезличенной информации в создаваемую тестовую базу данных) бывает полезно временно отключить все ограничения целостности для всех таблиц базы данных.
Инструмент это грубый (поскольку отключаются абслютно все ограничения), зато простой в использовании и не требующий глубокого анализа связей между таблицами - что потребуется для того, чтобы отключить только часть ограничений.

Полное отключение всех ограничений и триггеров для всех таблиц:

exec sp_MSforeachtable
@command1='alter table ? nocheck constraint all',
@command2='alter table ? disable trigger all'
go

Необходимо помнить, что эти операции не позволят выполнить оператор TRUNCATE TABLE, если на таблицах созданы внешние ключи (FOREIGN KEY) - увы, в этом случае удалять данные перед их повторной заливкой придётся с помощью медленных и скушных команд DELETE.

После выполнения загрузки изменённых данных обычно требуется обратно включить ограничения целостности.
Поскольку база данных в этот момент понятия не имеет, что мы там наделали с данными, при включении ограничений придётся проверить их выполнение.
Скрипт ниже печатает возникающие ошибки и имена таблиц, для которых эти ошибки возникли.

declare @cmd varchar(4000);
set @cmd = 'BEGIN TRY '
+ '  alter table ? with check check constraint all;'
+ '  alter table ? enable trigger all; '
+ 'END TRY '
+ 'BEGIN CATCH PRINT ''** ERROR on [?] - '' + ERROR_MESSAGE(); END CATCH';
exec sp_MSforeachtable @command1=@cmd
go

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org