J'ai un environnement de test pour une base de données que je souhaite recharger avec de nouvelles données au début d'un cycle de test. Je ne suis pas intéressé à reconstruire l'intégralité de la base de données, simplement à "redéfinir" les données.
Quelle est la meilleure façon de supprimer toutes les données de toutes les tables à l'aide de TSQL? Existe-t-il des procédures stockées système, des vues, etc. qui peuvent être utilisées? Je ne veux pas créer et maintenir manuellement des instructions de table tronquée pour chaque table - je préférerais qu'elle soit dynamique.
sql-server
tsql
Rayon
la source
la source
Lorsque vous traitez la suppression de données de tables qui ont des relations de clé étrangère - ce qui est fondamentalement le cas avec toute base de données correctement conçue - nous pouvons désactiver toutes les contraintes, supprimer toutes les données, puis réactiver les contraintes
Plus d'informations sur la désactivation des contraintes et des déclencheurs ici
si certaines tables ont des colonnes d'identité, nous pouvons vouloir les réensemencer
Notez que le comportement de RESEED diffère entre une toute nouvelle table et une table sur laquelle des données avaient été insérées précédemment à partir de BOL :
Merci à Robert d' avoir souligné le fait que la désactivation des contraintes ne permet pas d'utiliser tronquer, les contraintes devraient être supprimées, puis recréées
la source
SET ROWCOUNT 0
au début de votre script car la valeur par défaut est de limiter les actions à 500 lignes! Vous obtiendrez des erreurs frustrantes comme je l'ai fait, car toutes les données n'auront pas été supprimées.Voici le roi papa des scripts de nettoyage de base de données. Il effacera toutes les tables et les réamorcera correctement:
Profitez-en, mais faites attention!
la source
SET QUOTED_IDENTITY OFF
dans son corps ( lien ). MISE À JOUR: Le correctif consiste à ajouter "SET QUOTED_IDENTIFIERS on;" au début de chaque déclaration qui soulève cette erreur (comme mentionné ici )La façon la plus simple de procéder consiste à
cela vous donnera un script qui supprime et recrée toutes vos tables sans avoir à vous soucier du débogage ou si vous avez tout inclus. Bien que cela effectue plus qu'une simple troncature, les résultats sont les mêmes. Gardez à l'esprit que vos clés primaires à incrémentation automatique commenceront à 0, contrairement aux tables tronquées qui se souviendront de la dernière valeur attribuée. Vous pouvez également l'exécuter à partir du code si vous n'avez pas accès à Management studio sur vos environnements PreProd ou Production.
1.
2.
3.
la source
La troncature de toutes les tables ne fonctionnera que si vous n'avez aucune relation de clé étrangère entre vos tables, car SQL Server ne vous permettra pas de tronquer une table avec une clé étrangère.
Une alternative à cela consiste à déterminer les tables avec des clés étrangères et à les supprimer d'abord, vous pouvez ensuite tronquer les tables sans clés étrangères par la suite.
Voir http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65341 et http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=72957 pour plus de détails.
la source
Une autre option que j'aime utiliser avec MSSQL Server Deveploper ou Enterprise est de créer un instantané de la base de données immédiatement après avoir créé le schéma vide. À ce stade, vous pouvez simplement continuer à restaurer la base de données sur l'instantané.
la source
Ne fais pas ça! Vraiment, ce n'est pas une bonne idée.
Si vous savez quelles tables vous souhaitez tronquer, créez une procédure stockée qui les tronque. Vous pouvez corriger la commande pour éviter les problèmes de clé étrangère.
Si vous voulez vraiment tous les tronquer (afin que vous puissiez les charger par BCP par exemple), vous seriez tout aussi rapide de supprimer la base de données et d'en créer une nouvelle à partir de zéro, ce qui aurait l'avantage supplémentaire de savoir exactement où vous êtes.
la source
Si vous souhaitez conserver des données dans une table particulière (c'est-à-dire une table de recherche statique) tout en supprimant / tronquant des données dans d'autres tables dans la même base de données, vous avez besoin d'une boucle avec les exceptions qu'elle contient. C'est ce que je cherchais lorsque je suis tombé sur cette question.
sp_MSForEachTable me semble bogué (c'est-à-dire un comportement incohérent avec les instructions IF), c'est probablement pourquoi il n'est pas documenté par MS.
la source
La partie la plus difficile de tronquer toutes les tables consiste à supprimer et à ajouter à nouveau les contraintes de clé étrangère.
La requête suivante crée les instructions drop & create pour chaque contrainte relative à chaque nom de table dans @myTempTable. Si vous souhaitez les générer pour toutes les tables, vous pouvez simplement utiliser le schéma d'informations pour rassembler ces noms de table à la place.
Je copie ensuite simplement les instructions à exécuter - mais avec un peu d'effort de développement, vous pouvez utiliser un curseur pour les exécuter dynamiquement.
la source
Il est beaucoup plus facile (et peut-être même plus rapide) de créer un script pour votre base de données, puis de la déposer et de la créer à partir du script.
la source
Créez une base de données "modèle" vide, effectuez une sauvegarde complète. Lorsque vous avez besoin d'actualiser, restaurez simplement à l'aide de WITH REPLACE. Rapide, simple, pare-balles. Et si quelques tables ici ou là ont besoin de certaines données de base (par exemple, des informations de configuration ou simplement des informations de base qui font fonctionner votre application), elles le gèrent également.
la source
C'est une façon de le faire ... il y en a probablement 10 autres qui sont meilleurs / plus efficaces, mais il semble que cela se fasse très rarement, alors voici ...
obtenir une liste des
tables
desysobjects
boucle puis sur ceux avec un curseur, appelantsp_execsql('truncate table ' + @table_name)
pour chaqueiteration
.la source
Exécutez la section commentée une fois, remplissez la table _TruncateList avec les tables que vous souhaitez tronquer, puis exécutez le reste du script. La table _ScriptLog devra être nettoyée au fil du temps si vous le faites souvent.
Vous pouvez le modifier si vous voulez faire toutes les tables, il suffit de mettre le nom SELECT INTO #TruncateList FROM sys.tables. Cependant, vous ne voulez généralement pas tout faire.
En outre, cela affectera toutes les clés étrangères de la base de données, et vous pouvez également le modifier s'il est trop contraignant pour votre application. Ce n'est pas pour moi.
la source
Je ne vois pas pourquoi l'effacement des données serait mieux qu'un script pour supprimer et recréer chaque table.
Cela ou garder une sauvegarde de votre base de données vide et la restaurer sur l'ancienne
la source
Avant de tronquer les tables, vous devez supprimer toutes les clés étrangères. Utilisez ce script pour générer des scripts finaux pour supprimer et recréer toutes les clés étrangères dans la base de données. Veuillez définir la variable @action sur 'CREATE' ou 'DROP'.
la source
sélectionnez 'supprimer de' + TABLE_NAME de INFORMATION_SCHEMA.TABLES où TABLE_TYPE = 'BASE TABLE'
d'où vient le résultat.
Copiez et collez sur la fenêtre de requête et exécutez la commande
la source
Il est un peu tard mais cela pourrait aider quelqu'un. J'ai créé une procédure parfois en arrière qui fait ce qui suit en utilisant T-SQL:
Je l'ai listé sur mon blog ici
la source