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:
- Reiniciando las semillas de los autonuméricos.
- 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.
-- 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.
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.
ResponderEliminarUn saludo,
Domingo
Efectivamente Domingo, la sentencia TRUNCATE TABLE sería mucho más eficiente si tenemos en cuenta que no vamos a tener ninguna integridad.
ResponderEliminarOtra 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.