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);
Fuente: http://laboticadellanga.blogspot.com/2009/01/drop-table-cascade-constraints-sql.html
http://stackoverflow.com/questions/6196878/equivalent-for-drop-table-table-name-cascade-constraints-in-sql-server
No hay comentarios:
Publicar un comentario