Pregunta

¿Existe una forma sencilla de eliminar un grupo de tablas interrelacionadas en SQL Server?Idealmente, me gustaría evitar tener que preocuparme por el orden en que se colocarán, ya que sé que todo el grupo se habrá ido al final del proceso.

¿Fue útil?

Solución

A riesgo de parecer estúpido, no creo que SQL Server admita la sintaxis de eliminación/cascada.Creo que puedes configurar una regla de eliminación para realizar eliminaciones en cascada (http://msdn.microsoft.com/en-us/library/ms152507.aspx), pero hasta donde yo sé, el truco con SQL Server es simplemente ejecutar la consulta descartada una vez para cada tabla que está eliminando y luego verificar que funcionó.

Otros consejos

Un enfoque diferente podría ser:Primero, elimine las restricciones y luego elimine las tablas de una sola vez.

En otras palabras, una DROP CONSTRAINT para cada restricción, luego una DROP TABLE para cada tabla;En este punto, el orden de ejecución no debería ser un problema.

Esto requiere la sp___drop___restricciones guión que puedes encontrar en Diario de base de datos:

sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?"
GO
sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?"
GO

NOTA esto, obviamente, si desea eliminar TODAS las tablas de su base de datos, así que tenga cuidado

No tengo acceso a SQL Server para probar esto, pero ¿qué tal:

DROP TABLE IF EXISTS table1, table2, table3 CASCADE;

No estoy seguro de si el enfoque de Derek funciona.Aún no la has marcado como mejor respuesta.

Si no:Supongo que con SQL Server 2005 debería ser posible.
Allí introdujeron excepciones (que todavía no he usado).Así que suelte la tabla, detecte la excepción, si ocurre alguna, y pruebe la siguiente tabla hasta que desaparezcan todas.
Puede almacenar la lista de tablas en una tabla temporal y usar un cursor para recorrerla, si lo desea.

Terminé usando Apache ddlutiles para realizar la eliminación por mí, lo que solucionó el problema en mi caso, aunque una solución que funcionara sólo dentro del servidor SQL sería bastante más sencilla.

@Derek Park, no sabía que se podían separar tablas con comas allí, así que es útil, pero no parece funcionar como se esperaba.Parece que el servidor SQL no reconoce IF EXISTS ni CASCADE, y se ejecuta drop table X, Y, Z parece funcionar sólo si se deben eliminar en el orden indicado.

Ver también http://msdn.microsoft.com/en-us/library/ms173790.aspx, que describe la sintaxis de la tabla desplegable.

Lo que le impide eliminar las tablas en cualquier orden son las dependencias de clave externa entre las tablas.Así que deshazte de los FK antes de empezar.

  1. Usando las vistas del sistema INFORMACIÓN_SCHEMA, recupere una lista de todas las claves externas relacionadas con cualquiera de estas tablas
  2. Suelta cada una de estas claves foráneas
  3. Ahora debería poder eliminar todas las tablas, utilizando el orden que desee.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top