Nuevo sitio

Nos mudamos a www.f5run.com.ar

martes, 13 de enero de 2009

DROP TABLE CASCADE CONSTRAINTS - SQL SERVER

En Oracle, la sintaxis para borrar una tabla admite el modificador "CASCADE CONSTRAINTS". Estas dos palabritas mágicas borran primero todas las Foreing Keys que referencian a la tabla y luego, recién después se borra la tabla.

En SQL Server esto no existe. Es decir, si uno quiere borrar una tabla que es referenciada por otras tablas, primero tiene que borrar "a mano" las FKs y luego recién podrá borrar la tabla.

En caso contrario, se encontrará con un simpático mensaje:
Msg 3726, Level 16, State 1, Line 1
Could not drop object 'ent_campana' because it is referenced by a FOREIGN KEY constraint.

Acá dejo un muy modesto store procedure en Transact SQL que hace esto. Es un burdo ejemplo de lo mal que uno puede programar cerca de la medianoche, pero al menos funciona :)

-- USO:
-- droptable_cascade 'mytable'

create procedure droptable_cascade (@table_name varchar(500))
as
declare @fk_table_name varchar(500);
declare @const_name varchar(500);

declare vcursor cursor for
select const.name as const_name, fk_table.name fk_table_name
from sysobjects const
, sysobjects fk_table
, sysreferences sr
where const.id = sr.constid
and fk_table.id = sr.fkeyid
and sr.rkeyid = (select id from sysobjects where name = @table_name)

open vcursor
fetch next from vcursor
into @const_name, @fk_table_name
while @@fetch_status = 0
begin
exec ('alter table ' + @fk_table_name + ' drop constraint ' + @const_name);

-- Avanzamos otro registro
fetch next from vcursor
into @const_name, @table_name
end
close vcursor
deallocate vcursor

exec ('drop table ' + @table_name);

2 comentarios:

Abl dijo...

Saludos, te comento que usé tu script y me funcionó muy bien, gracias por el aporte.

Christian dijo...

Me alegro que te haya servido.
Saludos!