martes, 18 de octubre de 2011

Como borrar todos los datos de una base de datos

Bueno, aunque no es el campo que más domino, estrenaré el blog de manera oficial con un artículo sobre un pequeño script T-SQL que nos puede ser útil en algun momento. La situación es la siguiente, tengo una base de datos con más de 40 tablas y necesito dejar la base de datos limpia, vamos, sin ningun dato en las tablas.

La primera solución que se me vino a la cabeza es la ir tabla por tabla borrado todos sus datos, pero esta solución plantea dos problemas, primero, que es muy lenta, y segundo, que las tablas tienen relaciones por lo que hay que aplicar un orden concreto para el borrado lo cual complica más la operación. La siguiente solución que se me ocurrió fue consultar todas la tablas de la base de datos y luego generar los scripts para borrar dichas tablas desactivando previamente todas las restricciones, para posteriormente volver a activarlas. Mientras miraba un poco como hacer esto, vi que ya Microsoft había pensado en esto y nos da una serie de procedimientos almacenados para esto.

El script queda bastante simple y sería así
-- disable all constraints
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

-- delete data in all tables
EXEC sp_msForEachTable 'DELETE FROM ?'

-- enable all constraints
exec sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'
Al ejecutarlo vi que el script me servía perfectamente pero decidí dejarlo más fino con dos detalles más:
  1. Reiniciando las semillas de los autonuméricos.
  2. Haciendo un shrink de la base de datos para dejarla en la mínima expresión. En mi caso antes del shrink la base de datos ocupaba 250MB y después tan sólo 10MB, así que, a mi modo de ver, y siendo una base de datos de desarrollo, merece la pena.
El script definitivo queda la de la siguiente manera
-- disable all constraints
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

-- delete data in all tables
EXEC sp_msForEachTable 'DELETE FROM ?'

-- enable all constraints
exec sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'

-- reseed all tables
EXEC sp_msforeachtable 'DBCC CHECKIDENT ( "?"', RESEED, 0)'

-- shrink database
 DBCC SHRINKDATABASE (<DATABASE_NAME>, TRUNCATEONLY);
Solo hay que tener en cuenta que donde pone
<DATABALE_NAME>
hay que poner el nombre de la base de datos con la que estemos trabajando. Espero que les sea de ayuda.

2 comentarios:

  1. Una pregunta Sergio, ¿Por qué no usas TRUNCATE TABLE " es más rápido y ya que nos vas a respetar ninguna integridad ahorras mucho tiempo en bases de datos grandes.

    Un saludo,
    Domingo

    ResponderEliminar
  2. Efectivamente Domingo, la sentencia TRUNCATE TABLE sería mucho más eficiente si tenemos en cuenta que no vamos a tener ninguna integridad.

    Otra alternativa sería obtener el script de creación de todas las tablas, y crear la estructura en otra base de datos. Aunque esta última alternativa puede que no sea posible en entornos compartidos donde sólo tienes una base de datos, por ejemplo en algún hosting sql.

    ResponderEliminar