2011-02-01 9 views
18

en Oracle, a la caída de todas las tablas y las limitaciones que escribiría algo así comoServidor SQL: equivalente a la cascada de tablas sueltas?

DROP TABLE myTable CASCADE CONSTRAINTS PURGE; 

y esto sería eliminar por completo las tablas y sus dependencias. ¿Cuál es el equivalente de SQL Server?

+0

Respondido en: http://stackoverflow.com/questions/2247268/t-sql-drop-table-cascade-constraints-equivalent – rizzle

Respuesta

22

No creo que SQL tenga una solución igualmente elegante. Debe soltar todas las restricciones relacionadas antes de poder soltar la tabla.

Afortunadamente, todo esto se almacena en el esquema de información y puede acceder a eso para obtener su lista de coincidencias.

Esta entrada de blog debe ser capaz de conseguir 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 
29

En SQL Server Management Studio, vaya a Opciones/SQL de objetos Explorador de servidores/Scripting, y permitir 'Generar guión para dependientes objetos'. A continuación, haga clic con el botón derecho en la tabla, script> colocar en> nueva ventana de consulta y se generará por usted.

+0

También funciona para cayendo todos los objetos en un DB. Otro ejemplo del asombroso poder de los sms. me ha salvado el script de sys.objects !! –

+1

Solución no tan buena para OP, ahora entiendo por qué está deshabilitada de forma predeterminada.De alguna manera todas las tablas son "dependientes" de la tabla 'ContactInfo' ... ugh ... –

5

Esto podría ser una solución horrible, pero creo que es rápido. Es similar a la respuesta de Vinnie, pero el producto de la declaración SQL es otra serie de sentencias 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>' 
) 
1

En última instancia, estamos borrando nuestra tabla. Así podemos simplemente ejecutar 2 siguiente comando:

ALTER TABLE DROP CONSTRAINT ... ...

DROP TABLE ...

1> ALTER TABLE PRJ_DETAILS DROP CONSTRAINT FK_PRJ_TYPE;

- Nombre de tabla Nombre de restricción y son el parámetro

2> DROP TABLE.

Primera restricción de inserción con su nombre asociado a ella tabla En segundo lugar puede soltar la tabla.

Funcionó para mí y también es fácil.

1

Esto es todo diversión y juegos hasta que alguna tabla hace referencia a su mesa ...

Entonces debe modificar el código proporcionado de este modo:

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 
0

Sólo necesito eliminar 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 
Cuestiones relacionadas