2009-11-12 12 views
12

Tengo una lista de media docena de tablas de MSSQL 2008 que me gustaría eliminar de inmediato de mi base de datos. Los datos se han migrado por completo a nuevas tablas. No hay referencia en las tablas nuevas en las tablas antiguas .Cómo colocar una lista de tablas de SQL Server, ignorando las restricciones?

El problema es que las tablas antiguas vienen con un montón de restricciones FK internas que han sido autogeneradas por una herramienta (aspnet_regsql en realidad). Por lo tanto, eliminar manualmente todas las restricciones es un verdadero dolor.

¿Cómo puedo dejar caer las tablas antiguas ignorando todas las limitaciones internas?

Respuesta

3

Un simple DROP TABLE dbo.MyTable ignorará todas las restricciones (y desencadenantes), excepto las claves externas (a menos que elimine primero el archivo secundario/haciendo referencia a la tabla) donde es posible que deba soltarlas primero.

Editar: Después del comentario:

No hay forma automática. Tendrás que repetir iteraciones a través del sys.foreign_keys y generar algunas instrucciones ALTER TABLE.

+0

Gracias, pero mi problema es que precisamente hay un montón de FK generado. –

-1

Sospecho que tendrías que hacer un comando 'alterar' en las tablas ofensivas antes del lanzamiento para eliminar las contraseñas de clave forigen.

ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders; 
DROP TABLE Orders; 

Por supuesto, si primero quita las tablas secundarias, entonces no tendrá este problema. (a menos que tenga la tabla A, contrario a la tabla B y la restricción de la tabla B a A, deberá modificar una de las tablas, por ejemplo, A para eliminar la restricción)

p. esto no funciona, ya que Orders tiene un contraint en Order_Lines

DROP TABLE Orders; 
DROP TABLE Order_lines; 

p. esto funcionará

DROP TABLE Order_lines; 
DROP TABLE Orders; 
+0

Lo sentimos, pero hay toneladas de restricciones generadas automáticamente, no se pueden enumerar restricciones manualmente. –

+0

¿Cómo se crean las tablas? Creo que solo necesitará crear manualmente una secuencia de comandos que elimine las tablas sin restricciones y luego altere las otras tablas antes de eliminarlas. Sé que no es la respuesta que está buscando, pero es el mejor enfoque que puedo ofrecer. que tengo en mi proyecto algo simuliar, una instrucción SQL que altera la línea 40 filas y luego las gotas (no tablas en mi caso). El enlace –

0

fin encontré la solución basada en la script provided by Jason Presley. Este script elimina automáticamente todas las restricciones en el DB. Es fácil agregar una cláusula WHERE para que solo se aplique al conjunto de tablas afectadas. Después de eso, abandonar todas las tablas es sencillo.

+5

ya no funciona y no parece estar en la memoria caché de Google o Wayback –

1

he encontrado una manera razonable (más o menos) para hacerlo haciendo SQL escribir el código SQL para soltar las restricciones:

select concat("alter table ", table_name, " drop ", constraint_type ," ", constraint_name, ";") 
    from information_schema.table_constraints 
    where table_name like 'somefoo_%' 
     and 
     constraint_type <> "PRIMARY KEY"; 

Usted tendrá que modificar el nombre de la tabla para que se adapte a sus necesidades, o posiblemente seleccionar frente otra columna/valores.

Además, esto seleccionaría cualquier restricción de clave no primaria, que podría ser demasiado grande como una almádena. Tal vez necesitas simplemente configurarlo =?

No soy DBA. puede haber mejores formas de hacerlo, pero funcionó lo suficientemente bien para mis propósitos.

+2

'concat' no es un nombre de función incorporado reconocido. Es 2012+ –

6

Depende de cómo quiera soltar las tablas. Si la lista de tablas necesita colocar cubiertas casi por encima del 20% de las tablas en su base de datos.

Deshabilitaré todas las restricciones en ese DB bajo mi secuencia de comandos y soltaré las tablas y Habilitaré las restricciones bajo el mismo script.

--To Disable a Constraint at DB level 

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 

--Write the code to DROP tables 

DROP TABLE TABLENAME 

DROP TABLE TABLENAME 

DROP TABLE TABLENAME 

--To Enable a Constraint at DB level 

EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 

Finalmente, para verificar el estado de sus restricciones active esta consulta.

--Checks the Status of Constraints 

SELECT (CASE 
    WHEN OBJECTPROPERTY(CONSTID, 'CNSTISDISABLED') = 0 THEN 'ENABLED' 
    ELSE 'DISABLED' 
    END) AS STATUS, 
    OBJECT_NAME(CONSTID) AS CONSTRAINT_NAME, 
    OBJECT_NAME(FKEYID) AS TABLE_NAME, 
    COL_NAME(FKEYID, FKEY) AS COLUMN_NAME, 
    OBJECT_NAME(RKEYID) AS REFERENCED_TABLE_NAME, 
    COL_NAME(RKEYID, RKEY) AS REFERENCED_COLUMN_NAME 
FROM SYSFOREIGNKEYS 
ORDER BY TABLE_NAME, CONSTRAINT_NAME,REFERENCED_TABLE_NAME, KEYNO 

Si no desea desactivar las restricciones a nivel de base de datos a continuación, hacer una lista de tablas que desea colocar.

Paso 1: Comprobar las restricciones asociadas a los thos tablas

SELECT * 
FROM sys.foreign_keys 
WHERE referenced_object_id = object_id('dbo.Tablename') 

Paso 2: Desactivar las restricciones que se asocian con estas tablas.

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint 

Paso 3: eliminar las tablas

DROP TABLE TABLENAME 
1

Ejecutar la secuencia de comandos siguiente para eliminar todas las restricciones en todas las tablas bajo corriente de DB y luego ejecutar las sentencias de tabla de la gota.

DECLARE @dropAllConstraints NVARCHAR(MAX) = N''; 

SELECT @dropAllConstraints += N' 
ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) 
    + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + 
    ' DROP CONSTRAINT ' + QUOTENAME(name) + ';' 
FROM sys.foreign_keys; 
EXEC sp_executesql @dropAllConstraints 
Cuestiones relacionadas