2010-01-22 5 views
2

Dans le cadre d'un projet ASP.NET MVC sur lequel je travaille, je vais travailler avec SQL Server 2008 Express.Scripts de création de base de données SQL Server dans Visual Studio

Je ne suis pas sûr de savoir comment je devrais avoir une version contrôlable (j'utilise Mercurial) pour recréer la base de données.

Idéalement, il doit être exécuté chaque fois que j'effectuer une nouvelle génération dans Visual Studio 2008.

EDIT 1: En réponse à quelques réponses, je suis l'aide de Visual Studio 2008 Professional Edition, que j'ai reçu via le programme Dreamspark.

Répondre

2

Il existe plusieurs façons d'y parvenir en fonction de certaines spécificités de votre projet. Nous avons des fichiers .sql qui, lorsqu'ils sont exécutés, recréent la base de données. Cela permet aux scripts d'entrer dans votre contrôle source et d'être versionnés comme tout le reste. Il permet également d'ajouter des scripts de modification une fois qu'un produit est en production.

Nous l'utiliser pour déposer tous les objets dans notre base de données:

private static void DropDatabaseObjects() 
    { 
     var dropDatabaseObjects = 
      @" 
        /* Drop all non-system stored procs */ 
        DECLARE @name VARCHAR(128) 
        DECLARE @constraint VARCHAR(254) 
        DECLARE @SQL VARCHAR(254) 
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name]) 
        WHILE @name is not null 
        BEGIN 
         SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']' 
         EXEC (@SQL) 
         PRINT 'Dropped Procedure: ' + @name 
         SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name]) 
        END 

        /* Drop all views */ 
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name]) 
        WHILE @name IS NOT NULL 
        BEGIN 
         SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']' 
         EXEC (@SQL) 
         PRINT 'Dropped View: ' + @name 
         SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name]) 
        END 

        /* Drop all functions */ 
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name]) 
        WHILE @name IS NOT NULL 
        BEGIN 
         SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']' 
         EXEC (@SQL) 
         PRINT 'Dropped Function: ' + @name 
         SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name]) 
        END       

        /* Drop all Foreign Key constraints */ 
        SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME) 
        WHILE @name is not null 
        BEGIN 
         SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) 
         WHILE @constraint IS NOT NULL 
         BEGIN 
          SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT ' + RTRIM(@constraint) 
          EXEC (@SQL) 
          PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name 
          SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) 
         END 
        SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME) 
        END 

        /* Drop all Primary Key constraints */ 
        SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME) 
        WHILE @name IS NOT NULL 
        BEGIN 
         SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) 
         WHILE @constraint is not null 
         BEGIN 
          SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT ' + RTRIM(@constraint) 
          EXEC (@SQL) 
          PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name 
          SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) 
         END 
        SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME) 
        END 

        /* Drop all tables */ 
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name]) 
        WHILE @name IS NOT NULL 
        BEGIN 
         SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']' 
         EXEC (@SQL) 
         PRINT 'Dropped Table: ' + @name 
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name]) 
        END"; 
     using (var connection = new SqlConnection(GetConnectionStringFromHibernateConfiguration("hibernate.cfg.xml"))) 
     using (var command = new SqlCommand(dropDatabaseObjects, connection)) 
     { 
      connection.Open(); 
      command.ExecuteNonQuery(); 
      connection.Close(); 
     } 
    } 

Nous utilisons ce pour recréer notre base de données (en supposant que le dbScriptFolder contient des fichiers .sql qui permettra de créer toutes les tables, vues, procédures stockées, etc):

private static void RecreateDatabase() 
    { 
     var directoryInfo = new DirectoryInfo(ConfigurationManager.AppSettings["dbScriptFolder"]); 
     using (var connection = new SqlConnection(GetConnectionStringFromHibernateConfiguration("hibernate.cfg.xml"))) 
     { 
      connection.Open(); 
      foreach (var fileInfo in directoryInfo.GetFiles()) 
      { 
       if (fileInfo.Extension == ".sql") 
       { 
        var script = ReadFromFile(fileInfo); 
        var server = new Server(new ServerConnection(connection)); 
        server.ConnectionContext.ExecuteNonQuery(script); 
       } 
      } 
      connection.Close(); 
     } 
    } 

Ces méthodes s'appellent dans une méthode de TestFixture de base lorsque nous gérons nos tests d'intégration afin que nous savons que nous travaillons avec notre base de données dans un état connu.

Si vous cherchez à faire dans le cadre d'un script de construction, un regard sur le projet Tarantino here et here

+0

Je marque ceci comme la réponse car c'est fondamentalement comment je l'ai fait. ce blog que j'ai trouvé était très pratique aussi: http://blog.reamped.net/post/2008/05/Using-Database-Projects-for-Visual-Studio.aspx –

0

Utilisez-vous Visual Studio Team Suite ou Visual Studio Developer Edition? Si tel est le cas, Visual Studio Database Edition est gratuit et constitue un moyen fantastique de gérer votre schéma de base de données. A propos de toutes les fonctionnalités que vous pourriez vouloir.

Randy

2

Jetez un oeil à Visual Studio Team System 2008 Database Edition GDR (Or DataDude)

Cela vous permet de stocker et de travailler avec des schémas de base de données et des objets (tables, procédures, triggers ... à peu près tout). Il permet également de comparer un schéma par rapport à un autre, ou par rapport à une instance d'une base de données et générera des scripts de changement/déploiement.

Il existe également un support pour les données de référence (bien que ce ne soit pas très intéressant à ce stade de la vie des produits). Il y a aussi une intégration avec MSBuild - Je l'utilise maintenant sur un gros projet, chaque fois que nous faisons une construction, un fichier de schéma est généré que nous utilisons ensuite pour générer les scripts à appliquer à une base de données donnée (En utilisant VSDBCMD.EXE). À l'heure actuelle, nous ne rejetons pas automatiquement ces modifications, mais cela n'est pas trop difficile.

+0

Malheureusement, je ne dispose que l'accès à Visual Studio 2008 Professional Edition, et cela ne semble fonctionner pour mon édition. –

Questions connexes