![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
При пакетном переносе данных между базами 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
Инструмент это грубый (поскольку отключаются абслютно все ограничения), зато простой в использовании и не требующий глубокого анализа связей между таблицами - что потребуется для того, чтобы отключить только часть ограничений.
Полное отключение всех ограничений и триггеров для всех таблиц:
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