eliminacion - foreign key on update cascade sql server
SQL Server: caĆda de la tabla en cascada equivalente? (6)
En Oracle, para eliminar todas las tablas y restricciones, debe escribir algo como
DROP TABLE myTable CASCADE CONSTRAINTS PURGE;
y esto eliminaría completamente las tablas y sus dependencias. ¿Cuál es el equivalente del servidor SQL?
En SQL Server Management Studio, vaya a Opciones / SQL Server Object Explorer / Scripting, y active ''Generar script para objetos dependientes''. Luego haga clic derecho en la tabla, script> soltar a> nueva ventana de consulta y la generará por usted.
En definitiva estamos eliminando nuestra mesa. Así que simplemente podemos ejecutar 2 siguientes comandos:
ALTERAR MESA ... RESTRICCIÓN DE CAÍDA ...
MESA PLEGABLE ...
1> ALTER TABLE PRJ_DETAILS DROP CONSTRAINT FK_PRJ_TYPE ;
- El nombre de la tabla y el nombre de la restricción son el parámetro
2> TABLA DE GOTA.
Primera restricción de descarte con su nombre asociado a su tabla. Segundo, puede soltar la tabla.
Funcionó para mí y es fácil también.
Esta podría ser una solución horrible, pero me parece rápida. Es similar a la respuesta de Vinnie, pero el producto de la declaración SQL es otra serie de declaraciones SQL que eliminará todas las restricciones y tablas.
(
select
''ALTER TABLE '' + tc.table_name + '' DROP CONSTRAINT '' + tc.constraint_name + '';''
from
INFORMATION_SCHEMA.TABLES t
,INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
where
t.table_name = tc.table_name
and tc.constraint_name not like ''%_pk''
and tc.constraint_name not like ''pk_%''
and t.table_catalog=''<schema>''
) UNION (
select
''DROP TABLE '' + t.table_name + '';''
from
INFORMATION_SCHEMA.TABLES t
where
t.table_catalog=''<schema>''
)
Esto es todo diversión y juegos hasta que alguna mesa haga referencia a tu mesa ...
Entonces debo alterar el código provisto así:
CREATE PROCEDURE _cascadeConstraints @database nvarchar(30) = NULL, @table nvarchar(60) = NULL
as
DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
select @sql = ''ALTER TABLE '' + @table + '' DROP CONSTRAINT '' + CONSTRAINT_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where constraint_catalog = @database and
table_name = @table
select @sql = ''ALTER TABLE '' + tc.TABLE_NAME + '' DROP CONSTRAINT '' + tc.CONSTRAINT_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc join
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on
(rc.CONSTRAINT_CATALOG = tc.CONSTRAINT_CATALOG and
rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME) join
INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc_pk on
(tc_pk.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG and
tc_pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME)
where tc.constraint_catalog = @database
and tc_pk.TABLE_NAME = @table
exec sp_executesql @sql
END
go
No creo que SQL tenga una solución igualmente elegante. Debe eliminar las restricciones relacionadas antes de poder eliminar la tabla.
Afortunadamente, todo esto se almacena en el esquema de información y puede acceder a él para obtener su lista de whack.
Esta publicación de blog debería poder brindarle lo que necesita: http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx
-- t-sql scriptlet to drop all constraints on a table
DECLARE @database nvarchar(50)
DECLARE @table nvarchar(50)
set @database = ''DatabaseName''
set @table = ''TableName''
DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
select @sql = ''ALTER TABLE '' + @table + '' DROP CONSTRAINT '' + CONSTRAINT_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where constraint_catalog = @database and
table_name = @table
exec sp_executesql @sql
END
Solo necesito borrar la clave externa
DECLARE @database nvarchar(50)
DECLARE @TABLE_NAME nvarchar(250)
DECLARE @CONSTRAINT_NAME nvarchar(250)
DECLARE @sql nvarchar(350)
set @database = ''XXX''
DECLARE db_cursor CURSOR FOR
select TABLE_NAME, CONSTRAINT_NAME from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and CONSTRAINT_TYPE=''FOREIGN KEY''
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME
WHILE @@FETCH_STATUS = 0
BEGIN
select @sql = ''ALTER TABLE '' + @TABLE_NAME + '' DROP CONSTRAINT '' + @CONSTRAINT_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where constraint_catalog = @database and
table_name = @TABLE_NAME
exec sp_executesql @sql
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME
END
CLOSE db_cursor
DEALLOCATE db_cursor