Può capitare, nel fare programmi, di ereditare basi dati già create e di cui non abbiamo né una specifica né un po’ di documentazione. E’ quello che mi è capitato in un recente sviluppo. Database con più di 50 tabelle, tutte collegate con molte (troppe) FK. Dovendo mettere mano ai dati, mi si è posta la necessità di eliminare automaticamente le FK dal database.
Ecco di seguito lo script, che chiaramente si appoggia ai Sysobject di SqlServer…
declare @cmd nvarchar(500)
declare @foreign_table nvarchar(500)
declare @foreign_key_name nvarchar(500)DECLARE Kur CURSOR FOR
select cast(f.name as varchar(255)) as foreign_key_name,
cast(c.name as varchar(255)) as foreign_table
from sysobjects f inner join sysobjects c on f.parent_obj = c.id
inner join sysreferences r on f.id = r.constid inner join sysobjects p on r.rkeyid = p.id
inner join syscolumns rc on r.rkeyid = rc.id and r.rkey1 = rc.colid
inner join syscolumns fc on r.fkeyid = fc.id and r.fkey1 = fc.colid
left join syscolumns rc2 on r.rkeyid = rc2.id and r.rkey2 = rc.colid
left join syscolumns fc2 on r.fkeyid = fc2.id and r.fkey2 = fc.colid
where f.type = ‘F’OPEN Kur
FETCH NEXT FROM Kur
into @foreign_key_name, @foreign_table
WHILE @@FETCH_STATUS = 0
BEGIN
set @cmd=’ ALTER TABLE ‘ + @foreign_table + ‘ DROP CONSTRAINT ‘ + @foreign_key_name
/*print @cmd prima di eseguire magari diamo un occhio alle query che vengono generate*/
exec sp_executesql @cmd
FETCH NEXT FROM Kur
into @foreign_key_name, @foreign_table
END
CLOSE Kur