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