Tengo un entorno de prueba para una base de datos que quiero volver a cargar con datos nuevos al comienzo de un ciclo de prueba. No estoy interesado en reconstruir toda la base de datos, simplemente "restablecer" los datos.
¿Cuál es la mejor manera de eliminar todos los datos de todas las tablas con TSQL? ¿Existen procedimientos almacenados del sistema, vistas, etc. que puedan usarse? No quiero crear y mantener manualmente declaraciones de tabla truncadas para cada tabla; preferiría que fuera dinámico.
sql-server
tsql
Rayo
fuente
fuente
Cuando se trata de eliminar datos de tablas que tienen relaciones de clave externa, que es básicamente el caso con cualquier base de datos diseñada adecuadamente, podemos desactivar todas las restricciones, eliminar todos los datos y luego volver a habilitar las restricciones
Más sobre deshabilitar restricciones y disparadores aquí
Si algunas de las tablas tienen columnas de identidad, podemos resetearlas
Tenga en cuenta que el comportamiento de RESEED difiere entre una tabla nueva y una que había tenido algunos datos insertados previamente de BOL :
Gracias a Robert por señalar el hecho de que deshabilitar las restricciones no permite usar truncar, las restricciones tendrían que eliminarse y luego recrearse
fuente
SET ROWCOUNT 0
al comienzo de su script, ya que el valor predeterminado es limitar las acciones a 500 filas! Obtendrá errores frustrantes como lo hice yo porque no todos los datos se habrán eliminado.Aquí está el rey papá de los scripts de limpieza de bases de datos. Borrará todas las tablas y las reiniciará correctamente:
¡Disfruta, pero ten cuidado!
fuente
SET QUOTED_IDENTITY OFF
en su cuerpo ( enlace ). ACTUALIZACIÓN: La solución es agregar "SET QUOTED_IDENTIFIERS on"; al comienzo de cada declaración que genera este error (como se menciona aquí )La forma más sencilla de hacer esto es
esto le dará un script que descarta y recrea todas sus tablas sin la necesidad de preocuparse por la depuración o si ha incluido todo. Si bien esto realiza más que solo un truncamiento, los resultados son los mismos. Solo tenga en cuenta que sus claves primarias de incremento automático comenzarán en 0, a diferencia de las tablas truncadas que recordarán el último valor asignado. También puede ejecutar esto desde el código si no tiene acceso a Management studio en sus entornos PreProd o Production.
1)
2)
3)
fuente
Truncar todas las tablas solo funcionará si no tiene ninguna relación de clave externa entre sus tablas, ya que SQL Server no le permitirá truncar una tabla con una clave externa.
Una alternativa a esto es determinar las tablas con claves foráneas y eliminarlas primero, luego puede truncar las tablas sin claves foráneas después.
Consulte http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65341 y http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=72957 para obtener más detalles.
fuente
Una opción alternativa que me gusta usar con MSSQL Server Deveploper o Enterprise es crear una instantánea de la base de datos inmediatamente después de crear el esquema vacío. En ese momento, puede seguir restaurando la base de datos a la instantánea.
fuente
¡No hagas esto! Realmente, no es una buena idea.
Si sabe qué tablas desea truncar, cree un procedimiento almacenado que las trunca. Puede arreglar el pedido para evitar problemas de claves externas.
Si realmente desea truncarlos a todos (para poder cargarlos BCP, por ejemplo), sería tan rápido como soltar la base de datos y crear una nueva desde cero, lo que tendría el beneficio adicional de saber exactamente dónde se encuentra.
fuente
Si desea mantener los datos en una tabla en particular (es decir, una tabla de búsqueda estática) mientras elimina / trunca datos en otras tablas dentro de la misma base de datos, entonces necesita un bucle con las excepciones. Esto es lo que estaba buscando cuando me topé con esta pregunta.
sp_MSForEachTable me parece defectuoso (es decir, comportamiento inconsistente con las declaraciones IF), lo que probablemente sea la razón por la cual MS no lo documenta.
fuente
La parte más difícil de truncar todas las tablas es eliminar y volver a agregar las restricciones de clave externa.
La siguiente consulta crea las instrucciones drop & create para cada restricción relacionada con cada nombre de tabla en @myTempTable. Si desea generarlos para todas las tablas, puede simplemente usar el esquema de información para recopilar estos nombres de tabla.
Luego simplemente copie las declaraciones para ejecutarlas, pero con un poco de esfuerzo de desarrollo podría usar un cursor para ejecutarlas dinámicamente.
fuente
Es mucho más fácil (y posiblemente incluso más rápido) crear una secuencia de comandos de su base de datos, luego simplemente soltarla y crearla desde la secuencia de comandos.
fuente
Haga una base de datos de "plantilla" vacía, realice una copia de seguridad completa. Cuando necesite actualizar, simplemente restaure usando WITH REPLACE. Rápido, simple, a prueba de balas. Y si un par de tablas aquí o allá necesitan algunos datos de base (por ejemplo, información de configuración, o simplemente información básica que hace que su aplicación se ejecute), también lo maneja.
fuente
Este es uno forma de hacerlo ... es probable que haya otros 10 que sean mejores / más eficientes, pero parece que esto se hace con poca frecuencia, así que aquí va ...
obtenga una lista de
tables
fromsysobjects
, luego repita sobre aquellos con un cursor, llamandosp_execsql('truncate table ' + @table_name)
a cada unoiteration
.fuente
Ejecute la sección comentada una vez, complete la tabla _TruncateList con las tablas que desea truncar y luego ejecute el resto del script. La tabla _ScriptLog deberá limpiarse con el tiempo si hace esto mucho.
Puede modificar esto si desea hacer todas las tablas, simplemente ingrese el nombre SELECCIONAR EN #TruncateList FROM sys.tables. Sin embargo, generalmente no quieres hacerlos todos.
Además, esto afectará a todas las claves foráneas en la base de datos, y puede modificar eso también si es demasiado contundente para su aplicación. No es para mis propósitos.
fuente
No veo por qué borrar datos sería mejor que un script para soltar y volver a crear cada tabla.
Eso o mantener una copia de seguridad de su base de datos vacía y restaurarla sobre la anterior
fuente
Antes de truncar las tablas, debe eliminar todas las claves foráneas. Use este script para generar los scripts finales para descartar y recrear todas las claves foráneas en la base de datos. Establezca la variable @action en 'CREATE' o 'DROP'.
fuente
seleccione 'eliminar de' + TABLE_NAME de INFORMATION_SCHEMA.TABLES donde TABLE_TYPE = 'BASE TABLE'
de donde viene el resultado.
Copie y pegue en la ventana de consulta y ejecute el comando
fuente
Es un poco tarde pero podría ayudar a alguien. A veces creé un procedimiento que hace lo siguiente usando T-SQL:
Lo he enumerado en mi blog aquí.
fuente