При работе с большими базами данных возникает проблема при удалении записей из таблицы, на которую ссылается много других таблиц. Если все они содержат много данных, то проверка MS SQL на возможность удаления записи может длиться часами или даже сутками.
Быстрый фикс - удаление внешних ключей, редактирование таблицы и обратное взведение ключей.
Следующий скрипт формирует скрипты создания и удаления тех foreign keys, которые связаны с выбранной таблицей. Для того, чтобы получить информацию о внешних ключах, используется стандартная процедура sp_fkeys.
declare @tmp table
(
PKTABLE_QUALIFIER nvarchar(128)
,PKTABLE_OWNER nvarchar(128)
,PKTABLE_NAME nvarchar(128)
,PKCOLUMN_NAME nvarchar(128)
,FKTABLE_QUALIFIER nvarchar(128)
,FKTABLE_OWNER nvarchar(128)
,FKTABLE_NAME nvarchar(128)
,FKCOLUMN_NAME nvarchar(128)
,KEY_SEQ smallint
,UPDATE_RULE smallint
,DELETE_RULE smallint
,FK_NAME nvarchar(128)
,PK_NAME nvarchar(128)
,DEFERRABILITY smallint
)
declare
@sql_dropfk nvarchar(max) = '';
,@sql_createfk nvarchar(max) = '';
insert into @tmp
exec sp_fkeys @pktable_name = 'Валюты', @pktable_owner = 'хд'
;
select
@sql_dropfk = @sql_dropfk + '
if exists (select 1 from sys.objects where name = ' + QUOTENAME(FK_NAME, '''') +
'and type = ' + QUOTENAME('F','''') + ')
begin
alter table [' + FKTABLE_OWNER + '].[' + FKTABLE_NAME + '] drop constraint [' + FK_NAME + ']
end
go
'
from
@tmp
;
select
@sql_dropfk
;
select
@sql_createfk = @sql_createfk + '
alter table [' + FKTABLE_OWNER + '].[' + FKTABLE_NAME + '] with check add constraint ['+ FK_NAME + '] foreign key([' + FKCOLUMN_NAME + '])
REFERENCES [' + PKTABLE_OWNER + '].[' + PKTABLE_NAME + '] ([' + PKCOLUMN_NAME + '])
GO
alter table [' + FKTABLE_OWNER + '].[' + FKTABLE_NAME + '] check constraint [' + FK_NAME + ']
GO
'
from
@tmp
;
select
@sql_createfk
;
Комментариев нет:
Отправить комментарий