Procédures stockées/DB schéma du contrôle de code source
Faites-vous pour garder une trace de procédures stockées et de schéma de base de données dans votre système de contrôle de source de choix?
Lorsque vous apportez une modification (ajout d'un tableau, mettre à jour une procédure stockée, comment obtenez-vous les changements dans le contrôle de code source?
Nous utilisons SQL Server au travail, et j'ai commencé à utiliser darcs pour la gestion des versions, mais je serais curieux de connaître les stratégies générales ainsi que tous les outils pratiques.
Edit: Wow, merci pour toutes ces excellentes suggestions, les gars! Je souhaite que je pourrais sélectionner plus d'un "Accepté de Répondre"!
- Faire plus d'un "Accepté de Répondre à" une demande de fonctionnalité 😉
- Hmmm...je devrais peut-être!
- double possible de utilisez-vous de contrôle à la source pour vos articles de base de données?
Vous devez vous connecter pour publier un commentaire.
Nous choisissons de script tout, et qui comprend toutes les procédures stockées et les modifications de schéma. Pas de wysiwyg outils, et pas de fantaisie "sync" des programmes sont nécessaires.
Les modifications de schéma sont faciles, tout ce que vous devez faire est de créer et de maintenir un seul fichier pour cette version, y compris tous les schémas et les données de changements. Cela devient votre script de conversion à partir de la version x à x+1. Vous pouvez ensuite exécuter à l'encontre d'une production de sauvegarde et de l'intégrer dans votre quotidien build " pour vérifier qu'il fonctionne sans erreurs. Remarque il est important de ne pas les modifier ou les supprimer a déjà écrit schéma /chargement de données sql que vous pouvez finir par casser quelque sql écrit plus tard.
Pour les procédures stockées, nous avons élus pour un fichier unique par la procédure stockée, et il utilise le drop/create forme. Toutes les procédures stockées sont recréés lors du déploiement. L'inconvénient est que si un changement a été effectué à l'extérieur de la source de contrôle, le changement est perdu. En même temps, c'est vrai pour n'importe quel code, mais votre DBA a besoin d'être conscient de cela. Cela s'arrête vraiment les gens à l'extérieur de l'équipe de nettoyage avec les procédures stockées, que leurs modifications sont perdues dans une mise à niveau.
À l'aide de Sql Server, la syntaxe ressemble à ceci:
La seule chose qui reste à faire est d'écrire un programme utilitaire qui rassemble tous les fichiers et crée un nouveau fichier avec l'ensemble des mises à jour (comme un script unique). Faire cela en ajoutant d'abord le schéma des changements, alors recursing la structure de répertoire et y compris la procédure stockée fichiers.
Comme un avantage pour les scripts tout, vous devenez beaucoup mieux à la lecture et à l'écriture SQL. Vous pouvez également vous rendre ce processus plus élaboré, mais c'est le format de base de la façon de source-toutes les commandes sql sans aucun logiciel spécial.
addendum: Rick est exact que vous allez perdre des autorisations sur des procédures stockées avec DROP/CREATE, de sorte que vous pouvez avoir besoin d'écrire un autre script de ré-activer les autorisations spécifiques. Cette autorisation script serait le dernier à s'exécuter. Notre expérience de plus de problèmes avec ALTER versets DROP/CREATE sémantique. YMMV
créer un "projet de Base de données" dans Visual Studio pour écrire et gérer votre code sQL et garder le projet sous contrôle de version avec le reste de votre solution.
La solution que nous avons utilisée lors de mon dernier emploi était de nombre les scripts qu'ils ont été ajoutés à la source de contrôle:
01.CreateUserTable.sql
02.PopulateUserTable
03.AlterUserTable.sql
04.CreateOrderTable.sql
L'idée était que nous avons toujours su que l'ordre d'exécuter les scripts, et nous avons pu nous éviter d'avoir à gérer les problèmes d'intégrité des données qui pourraient survenir si vous avez essayé de modifier le script #1 (ce qui serait probable causer la Insère dans #2 à l'échec).
Une chose à garder à l'esprit votre chute de/créer des scripts de SQL Server est l'objet des autorisations de niveau sera perdu. Nous avons changé notre standard d'utiliser de MODIFIER les scripts au lieu de cela, ce qui maintient ces autorisations.
Il y a quelques autres mises en garde, comme le fait que la suppression d'un objet gouttes de la dépendance des dossiers utilisés par sp_depends, et la création de l'objet crée seulement les dépendances de cet objet. Donc, si vous déposez/créer une vue, sp_depends ne sait plus d'objets dans le référencement de ce point de vue.
Morale de l'histoire, de l'utilisation de MODIFIER les scripts.
Je suis d'accord avec (et upvote) Robert Paulson de la pratique. C'est en supposant que vous êtes dans le contrôle d'une équipe de développement de la responsabilité et de la discipline à adhérer à une telle pratique.
De "force" que sur mes équipes, nos solutions de maintenir au moins un projet de base de données à partir de Visual Studio Team Edition for Database Professionals. Comme avec d'autres projets dans la solution, le projet de base de données devient de contrôle de version. Il en fait une évolution naturelle du processus de rompre le tout dans la base de données en maintenable morceaux, "discipliner" mon équipe le long de la voie.
Bien sûr, être un projet Visual Studio, il est pas loin d'être parfait. Il y a beaucoup de bizarreries que vous rencontrerez susceptibles d'entraver ou de vous confondre. Il faut un peu juste de comprendre le fonctionnement du projet avant de l'obtenir pour accomplir vos tâches. Les exemples incluent
Mais pour les équipes qui n'ont pas une pratique de gestion des versions de leurs objets de base de données, c'est un bon début. D'autres célèbres alternative est bien sûr, Porte rouge de la gamme de produits SQL Server, la plupart des gens qui les utilisent considérer supérieur à Microsoft offre.
Je pense que vous devriez écrire un script qui configure automatiquement votre base de données, y compris toutes les procédures stockées. Ce script doit ensuite être placé dans le contrôle de source.
Couple de différents points de vue de mon expérience. Dans l'Oracle du monde, tout était géré par "créer" scripts DDL. Comme ahockley mentionné, l'un script pour chaque objet. Si l'objet doit changer son script DDL est modifié. Il y a un script qui appelle tous l'objet de scripts, de sorte que vous pouvez déployer l'actuel DB construire quel que soit l'endroit que vous voulez. C'est pour la base principale de créer.
De toute évidence dans une application, chaque fois que vous poussez une construction nouvelle qui requiert, par exemple, une nouvelle colonne, vous n'allez pas tomber de la table et de créer de nouvelles. Vous allez faire un ALTER script et ajouter la colonne. Donc, chaque fois que ce genre de changement qui doit se produire, il y a toujours deux choses à faire: 1) écrire l'alter DDL et 2) mise à jour de la base de créer DDL afin de refléter le changement. Les deux vont dans le contrôle de source, mais la seule modifier le script est plus un momentané point dans le temps du changement, car il ne sera utilisée que pour appliquer un delta.
Vous pouvez également utiliser un outil comme ERWin pour mettre à jour le modèle et l'avant de générer le DDL, mais la plupart des Administrateurs de base de données, je sais ne pas faire confiance à un outil de modélisation de gen le script exactement de la manière qu'ils veulent. Vous pouvez également utiliser ERWin à désosser votre cœur de script DDL dans un modèle périodiquement, mais c'est beaucoup de tracas pour obtenir à regarder à droite (chaque sablé fois que vous le faites).
Dans le monde Microsoft, nous avons utilisé une tactique similaire, mais nous avons utilisé la Porte Rouge produit pour aider à gérer les scripts et les deltas. Toujours mettre les scripts dans le contrôle de source. Encore un script par objet (tableau, la procédure stockée, peu importe). Au début, certains des Administrateurs de base de données vraiment préféré à l'aide de SQL Server interface graphique pour gérer les objets plutôt que d'utiliser des scripts. Mais qu'il est très difficile de gérer l'entreprise de façon constante comme elle a grandi.
Si le DDL est en contrôle de code source, il est trivial d'utiliser tout outil de construction (généralement ant) pour l'écriture d'un script de déploiement.
J'ai trouvé que, de loin, la méthode la plus simple, le plus rapide et le plus sûr de faire est de mordre la balle et l'utilisation de SQL à la Source de Contrôle de RedGate. Script et stockées dans le référentiel dans une affaire de minutes. Je souhaite juste que RedGate regarde le produit en tant que chef de la perte de sorte qu'il pourrait obtenir une utilisation plus répandue.
Similaire à Robert Paulson, ci-dessus, notre organisation maintient la base de données sous contrôle de code source. Cependant, notre différence, c'est que nous essayons de limiter le nombre de scripts que nous avons.
Pour tout nouveau projet, il y a une procédure bien établie. Nous avons un schéma de script de création de la version 1, une procédure stockée script de création et éventuellement d'un premier chargement des données de création de script. Tous les procs sont gardés dans un seul, certes massive de fichiers. Si nous utilisons la Bibliothèque d'Entreprise, nous incluons une copie du script de création de l'enregistrement; si c'est un ASP.NET projet à l'aide de la ASP.NET cadre d'application (authentification, personnalisation, etc.), nous inclure le script. (Nous avons généré depuis les outils de Microsoft, puis modifié jusqu'à ce que il a travaillé dans la province de gauteng, la mode à travers les différents sites. Pas de plaisir, mais un temps précieux investissement.)
Nous utilisons la magie CTRL+F pour trouver le proc comme on les aime. 🙂 (Nous aime si SQL Management Studio avait la navigation dans le code comme VS ne. Soupir!)
Pour les versions suivantes, nous avons habituellement upgradeSchema, upgradeProc et/ou updateDate scripts. Pour les mises à jour de schéma, nous avons MODIFIER des tables, autant que possible, d'en créer de nouveaux au besoin. Pour le proc mises à jour, nous sortons et de CRÉER.
Une ride ne pop up avec cette approche. Il est facile de générer une base de données, et il est facile d'obtenir un nouveau lever à la vitesse sur l'actuelle version DB. Cependant, des précautions doivent être prises avec DAL génération (dont nous avons actuellement, et d'habitude -- faire avec Subsonique), pour s'assurer que DB/schema/proc modifications sont synchronisées proprement avec le code utilisé pour y accéder. Cependant, dans nos chemins de génération est un fichier batch qui génère le Subsonique DAL, il est donc de notre SOP à la caisse de la DAL code, exécutez de nouveau que le fichier de commandes, puis vérifier tout le dos en tout temps le schéma et/ou procs changement. (Ce qui, bien sûr, déclenche une source de construire, la mise à jour partagé dépendances appropriée à la Dll ... )
Dans les expériences passées, j'ai gardé les modifications de base de données source contrôlée de telle sorte que, pour chaque version du produit toutes les modifications de base de données ont été toujours générée et stockée dans la version sur laquelle nous travaillons. Le processus de construction en place entraînerait automatiquement la base de données jusqu'à la version actuelle basée sur une table dans la base de données stockée la version actuelle pour chaque "application". Une coutume .l'utilité nette de l'application, nous avons écrit aurait ensuite exécuter et de déterminer la version actuelle de la base de données, et d'exécuter tous les nouveaux scripts contre lui afin de le préfixe des numéros de scripts. Nous avons exécuter des tests unitaires pour s'assurer que tout était bon.
Nous avions stocker les scripts de contrôle de code source comme suit (structure de dossier ci-dessous):
Je suis un peu rouillé sur les actuelles conventions de nommage sur les tables et procédures stockées afin nu avec mon exemple...
[root]
[application]
[version]
[script]
\scripts
MyApplication\
1.2.1\
001.MyTable.Créer.sql
002.MyOtherTable.Créer.sql
100.dbo.usp.MyTable.GetAllNewStuff.sql
Avec l'utilisation d'une table Versions qui prennent en compte l'Application et la Version de l'application permettrait de rétablir la production hebdomadaire de sauvegarde, et d'exécuter tous les scripts nécessaires à l'encontre de la base de données depuis la version actuelle. À l'aide de .net nous avons pu le paquet de ce dans une transaction et si quoi que ce soit en panne et nous permettrait de restauration, et d'envoyer des e-mails, donc nous savions que la libération avait de mauvais scripts.
Donc, tous les développeurs assurez-vous de maintenir cette source de contrôle pour la publication coordonnée permettrait de faire en sorte que tous les scripts de nous avons plan à l'encontre de la base de données, exécuter avec succès.
C'est probablement le plus d'informations que vous cherchiez, mais ça a très bien fonctionné pour nous et compte tenu de la structure il était facile d'obtenir tous les développeurs sur conseil d'administration.
Lors de la journée de libération est venu autour de l'équipe des opérations serait de suivre les notes de version, et ramasser les scripts à partir de la source de contrôle et d'exécuter le package sur la base de données avec le .net application, nous avons utilisé au cours de la nuit du processus de construction qui serait automatiquement le paquet de scripts dans les transactions de sorte que si quelque chose a échoué, il serait automatiquement annulée et aucun impact sur la base de données a été faite.
Procédures stockées obtenir 1 fichier par sp avec le standard s'il existe drop/create des déclarations au sommet. Les vues et les fonctions bénéficiez également de leurs propres fichiers de sorte qu'ils sont plus facile à la version et à la réutilisation.
Schéma est tous 1 script pour commencer, puis nous allons faire des changements de version.
Tout cela est stocké dans une base de données visual studio projet lié à TFS (@ work ou VisualSVN Serveur @ home pour des trucs personnels) avec une structure de dossier comme suit:
- projet
-- fonctions
-- schéma
-- procédures stockées
-- vues
Dans mon entreprise, nous avons tendance à stocker tous les éléments de base de données dans la source de contrôle individuel des scripts comme vous le feriez pour les fichiers de code individuels. Toutes les mises à jour sont d'abord réalisés dans la base de données et ensuite migré dans le référentiel de code source donc un historique des modifications est conservé.
Dans une deuxième étape, toutes les modifications de base de données sont migrées vers une intégration de base de données. Cette intégration de base de données représente exactement ce que la base de données de production devrait ressembler post-déploiement. Nous avons également une QA base de données qui représente l'état actuel de la production (ou le dernier déploiement). Une fois tous les changements réalisés dans l'Intégration de base de données, nous utilisons un schéma outil de comparaison (Porte Rouge SQL Diff pour SQL Server) pour générer un script qui va migrer toutes les modifications à partir d'une base de données à l'autre.
Nous avons trouvé cela assez efficace car il génère un seul script que l'on peut intégrer à nos installateurs facilement. La question la plus importante qui nous ont souvent, c'est aux développeurs d'oublier de transférer leurs changements dans l'intégration.
Nous garder des procédures stockées dans la source de contrôle.
Script tout (création d'objet, etc) et de les stocker ces scripts dans le contrôle de source. Comment les changements s'y rendre? Il fait partie de la norme de pratique de la façon dont les choses sont faites. Besoin d'ajouter une table? Écrire un script de création de TABLE. Mise à jour d'une procédure stockée? Modifier la procédure stockée script.
Je préfère un script par objet.
Pour les procs, écrire le procs avec un script wrappers dans la plaine de fichiers, et appliquer les modifications de ces fichiers. Si elle est appliquée correctement, alors vous pouvez vérifier que le fichier, et vous serez en mesure de la reproduire à partir de ce fichier en tant que bien.
Pour les modifications de schéma, vous pouvez avoir besoin de vérifier dans les scripts incrémentielle de faire les modifications que vous avez apportées. Écrire le script, de l'appliquer, et puis l'archiver. Vous pouvez construire un processus ensuite, pour appliquer automatiquement chaque schéma de script dans la série.
Nous garder des procédures stockées dans la source de contrôle. La façon dont nous (ou du moins je) faire c'est ajouter un dossier de mon projet, ajouter un fichier pour chaque SP et manuellement copier-coller le code. Alors quand j'ai changer la SP, j'ai manuellement besoin de modifier le fichier de commande de la source.
Je serais intéressé d'entendre si les gens peuvent faire cela automatiquement.
Je recommande fortement le maintien d'un schéma et des procédures stockées dans la source de contrôle.
De maintien de procédures stockées versionnées leur permet d'être annulée lorsqu'elle est jugée problématique.
Schéma est moins évidente, en fonction de ce que tu veux dire. Il est très utile pour maintenir le SQL qui définit vos tables dans le contrôle de source, pour la duplication des environnements (prod/dev/utilisateur, etc.).
Nous avons été en utilisant une approche alternative dans mon projet actuel, nous n'avons pas eu le db sous contrôle de code source, mais plutôt avoir été à l'aide d'une base de données diff outil de script pour les modifications apportées à chaque version.
Il a travaillé très bien pour l'instant.
Nous stockons tout ce qui a trait à la demande de nos SCM. La DB scripts sont généralement stockés dans leur propre projet, mais sont traités comme tout autre code... concevoir, implémenter, tester, valider.
J'ai l'exécution d'une tâche de script à une formelle de la structure de répertoire.
Voici VS2005 code, projet ligne de commande, appelé à partir d'un fichier de commandes, qui fait le travail. app.clés de configuration à la fin du code.
Il est basé sur d'autres codes que j'ai trouvé en ligne. Un peu à une douleur à mettre en place, mais fonctionne bien une fois que vous obtenez le travail.
Si vous êtes à la recherche pour un facile, de solution toute faite, notre Sql Historien système utilise un processus d'arrière-plan à synchronise automatiquement les modifications DDL pour TFS ou SVN, transparente à toute personne en faisant des modifications sur la base de données. Dans mon expérience, le gros problème est de maintenir le code de contrôle de code source avec ce qui a été changé sur votre serveur, et c'est parce que d'habitude, vous devez compter sur des personnes (développeurs, même!) modifier leur flux de travail et n'oubliez pas de vérifier dans leurs changements après qu'ils ont déjà fait sur le serveur. Mettre le fardeau sur une machine rend la vie de chacun plus facile.