2010-01-22 6 views
2

작업중인 ASP.NET MVC 프로젝트의 일부로 SQL Server 2008 Express로 작업 할 것입니다.Visual Studio의 SQL Server 데이터베이스 작성 스크립트

버전 관리가 가능한 (저는 Mercurial을 사용하고 있습니다) 데이터베이스를 재생성하는 방법에 대해 어떻게해야하는지 잘 모르겠습니다.

이상적으로 내가 Visual Studio에서 빌드를 수행 할 때마다 실행해야 2008 년

편집 1 : 답변 부부에 대응하여, 내가 통해 받았다 한 비주얼 스튜디오 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 방법에 호출됩니다.

당신이 빌드 스크립트의 일부로이 작업을 수행하고자하는 경우는 타란티노 프로젝트 here 불행히도 here

+0

기본적으로이 작업을 수행 했으므로이를 답변으로 표시하고 있습니다. 내가 찾은이 블로그 게시물은 매우 유용했습니다. http://blog.reamped.net/post/2008/05/Using-Database-Projects-for-Visual-Studio.aspx –

0

Visual Studio Team Suite 또는 Visual Studio Developer Edition을 사용하고 있습니까? 그렇다면 Visual Studio Database Edition은 무료이며 데이터베이스 스키마를 관리하는 환상적인 방법입니다. 원하는 모든 기능을 갖추고 있습니다. 랜디

2

이 당신이 저장하고 데이터베이스 스키마 및 공예품 (테이블, 프로 시저, 트리거 ... 거의 모든)와 함께 작업 할 수 있습니다 Visual Studio Team System 2008 Database Edition GDR (Or DataDude)

에서보세요. 또한 한 스키마를 다른 스키마와 비교하거나 데이터베이스 인스턴스와 비교할 수 있으며 변경/배포 스크립트를 생성합니다.

참조 데이터도 지원됩니다 (제품 수명의 현 단계에서는 좋지 않지만).

또한 MSBuild와 통합되어 있습니다. 이제는 큰 프로젝트에서이 빌드를 사용할 때 스키마 파일이 생성되어 실제로 주어진 데이터베이스에 적용 할 스크립트를 생성합니다 VSDBCMD.EXE 사용). 현재 이러한 변경 사항을 자동으로 푸시하지 않지만 너무 어렵지 않습니다.

+0

나는 단지 비주얼 스튜디오 2008 프로페셔널 에디션에 액세스 할 수에서 봐 가지고, 이것은하지 않습니다 내 에디션에서 효과가있는 것 같습니다. –

관련 문제