Oggetti che dipendono da una tabella: DROP e ADD FOREIGN KEY CONSTRAINT

Ci si può trovare nella situazione di dover eliminare e ricreare (successivamente) le dipendenze (FOREIGN KEY) da una tabella alterando gli oggetti che dipendono da essa.

Pensiamo, ad esempio, alla necessità di eliminare e ricreare una tabella che ha integrità referenziale con altre, uno degli step necessari è appunto l’eliminazione delle dipendenze (FOREIGN KEY) sugli oggetti che dipendono dalla tabella da ricreare.

Il seguente comando T-SQL permette di individuare facilmente i comandi di eliminazione e ripristino delle FOREIGN KEY sulle tabelle che dipendono dalla tabella citata nella clausola WHERE del comando.

/*
  Scripting dei comandi DROP CONSTRAINT e ADD CONSTRAINT per
  le FOREIGN KEY definite sugli gli oggetti che dipendono da una tabella
*/

select
  ‘/* =———– DROP CONSTRAINT ———–= */’ as command

union all

select
  (‘alter table ’ + rtrim(objp.name) +
   ’ drop constraint ’ + constr.name) as command
from
  sys.foreign_key_columns as fkc
join
  sys.objects as objp on objp.object_id=fkc.parent_object_id
join
  sys.objects as objr on objr.object_id=fkc.referenced_object_id
join
  sys.columns as colr on colr.column_id=fkc.referenced_column_id and
                         colr.object_id=fkc.referenced_object_id
join
  sys.columns as colp on colp.column_id=fkc.parent_column_id and
                         colp.object_id=fkc.parent_object_id
join
  sys.objects as constr on constr.object_id=fkc.constraint_object_id
where
  (objr.name = ‘<nome_tabella>’)
  and (objr.type = ‘U’)

union all

select
  ‘/* =———– ADD CONSTRAINT ———–= */’ as command

union all

select
  (‘alter table ’ + rtrim(objp.name) +
   ’ add constraint ’ + constr.name +
   ’ foreign key (’ + colp.name + ‘)’ +
   ’ references ’ + rtrim(objr.name)+’(’+colr.name+’)’) as command
from
  sys.foreign_key_columns as fkc
join
  sys.objects as objp on objp.object_id=fkc.parent_object_id
join
  sys.objects as objr on objr.object_id=fkc.referenced_object_id
join
  sys.columns as colr on colr.column_id=fkc.referenced_column_id and
                         colr.object_id=fkc.referenced_object_id
join
  sys.columns as colp on colp.column_id=fkc.parent_column_id and
                         colp.object_id=fkc.parent_object_id
join
  sys.objects as constr on constr.object_id=fkc.constraint_object_id
where
  (objr.name = ‘<nome_tabella>’)
  and (objr.type = ‘U’);
go