2010-01-22 117 views
2

作爲我正在開發的ASP.NET MVC項目的一部分,我將使用SQL Server 2008 Express。Visual Studio中的SQL Server數據庫創建腳本

我不知道我應該怎麼做有一個版本控制(我使用Mercurial)重新創建數據庫的方式。

理想情況下,應運行每次我在Visual Studio中進行編譯時間2008年

編輯1:針對情侶的答案,我使用Visual Studio 2008專業版,這是我收到通過Dreamspark程序。

回答

2

根據您的一些項目細節,有幾種方法可以完成此操作。我們有.sql文件,在執行時重新創建數據庫。這允許腳本進入源代碼管理,並像其他所有內容一樣進行版本控制。它還允許在產品投入生產時添加更改腳本。

我們用這個砸在我們的數據庫中的所有對象:

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(); 
     } 
    } 

我們用它來重建我們的數據庫(假設dbScriptFolder包含將創建所有的表,視圖,存儲的特效.sql文件,等):

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(); 
     } 
    } 

這些方法被調用在基本的TestFixture方法,當我們運行我們的集成測試,所以我們知道我們是在一個已知的狀態與我們的數據庫工作。

如果你要做到這一點作爲構建腳本的一部分,看看在塔倫蒂諾項目herehere

+0

我把這個標記爲答案,因爲這基本上是我做過的。我發現的這篇博文很好用:http://blog.reamped.net/post/2008/05/Using-Database-Projects-for-Visual-Studio.aspx – 2010-01-25 11:26:56

0

您是使用Visual Studio Team Suite還是Visual Studio Developer Edition?如果是這樣,Visual Studio數據庫版本是免費的,並且是管理數據庫模式的絕佳方式。具有您可能想要的所有功能。

蘭迪

2

看一看Visual Studio Team System 2008 Database Edition GDR (Or DataDude)

這允許你存儲,並與數據庫模式和藝術品(表,過程,觸發器......幾乎一切)工作。它還允許比較一個模式與另一個模式或數據庫實例,並生成更改/部署腳本。

也支持參考數據(雖然這在產品壽命的這個階段並不好)。

還有一個與MSBuild的集成 - 我現在在一個大項目上使用它,每次我們進行構建時,都會生成一個模式文件,然後我們使用它來實際生成應用於給定數據庫的腳本使用VSDBCMD.EXE)。我們目前不會自動推出這些更改,但這樣做並不困難。

+0

不幸的是我只能訪問到Visual Studio 2008專業版,這不似乎爲我的版本工作。 – 2010-01-22 07:18:27

相關問題