вторник, 20 июня 2017 г.

Скрипты для создания/удаления внешних ключей


При работе с большими базами данных возникает проблема при удалении записей  из таблицы, на которую ссылается много других таблиц. Если все они содержат много данных, то проверка 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
;

Комментариев нет:

Отправить комментарий