[sql-server] SQL Server Management Studio 2008에서 “스크립트 생성”작업을 자동화하려면 어떻게해야합니까?

SQL Server Management Studio 2008에서 스크립트 생성을 자동화하고 싶습니다.

지금 내가하는 일은 :

  • 내 데이터베이스, Tasks, “Generate Scripts …”를 마우스 오른쪽 버튼으로 클릭합니다.
  • 필요한 모든 내보내기 옵션을 수동으로 선택하고 “개체 선택”탭에서 모두 선택을 누릅니다.
  • 내보내기 폴더 선택
  • 결국 “마침”버튼을 누르십시오.

이 작업을 자동화하는 방법이 있습니까?

편집 : 스크립트를 변경하지 않고 생성 스크립트 를 생성하고 싶습니다 .



답변

Brann이 Visual Studio 2008 SP1 Team Suite에서 언급 한 것은 데이터베이스 게시 마법사 버전 1.4입니다. SQL Server 2008 (전문가 용일 수도 있음)과 함께 \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4에 설치됩니다. 서버 탐색기의 VS 호출은 단순히 이것을 호출합니다. 다음과 같은 명령 줄을 통해 동일한 기능을 수행 할 수 있습니다.

sqlpubwiz help script

v1.4에 v1.1과 동일한 문제가 있는지는 모르겠지만 (사용자가 역할로 변환되고 제약 조건이 올바른 순서로 생성되지 않음) 개체를 스크립팅하지 않기 때문에 저에게 해결책이 아닙니다. SSMS의 Tasks-> Generate Scripts 옵션과 같은 다른 파일에. 현재 수정 된 버전의 Scriptio (MS SMO API 사용)를 사용하여 데이터베이스 게시 마법사 (sqlpubwiz.exe)의 향상된 대체 역할을하고 있습니다. 현재는 명령 줄에서 스크립팅 할 수 없습니다. 나중에 해당 기여도를 추가 할 수 있습니다.

Scriptio는 원래 Bill Graziano의 블로그에 게시되었지만 이후 Bill에 의해 CodePlex에 릴리스되고 다른 사용자가 업데이트했습니다. SQL Server 2008에서 사용하기 위해 컴파일하는 방법을 보려면 토론을 읽으십시오.

http://scriptio.codeplex.com/

편집 : 이후 RedGate의 SQL Compare 제품을 사용하기 시작했습니다. SQL 게시 마법사가 필요했던 모든 것을 매우 훌륭하게 대체합니다. 데이터베이스, 백업 또는 스냅 샷을 소스로 선택하고 폴더를 출력 위치로 선택하면 모든 것을 폴더 구조로 멋지게 덤프합니다. 다른 제품인 SQL Source Control에서 사용하는 것과 동일한 형식입니다.


답변

SqlPubwiz는 SSMS의 스크립트 생성에 비해 옵션이 매우 제한적입니다. 대조적으로 SMO에서 사용할 수있는 옵션 은 SSMS 의 옵션과 거의 정확히 일치하므로 동일한 코드 일 수도 있습니다. (I는 MS가 두 번 작성하지 않은 희망!) 같은 MSDN에 몇 가지 예제가 있습니다 이 하나의 개별 개체 스크립팅 테이블을 보여줍니다. 그러나 외래 키와 같은 ‘DRI'(Declarative Referential Integrity) 개체를 포함하는 ‘전체’스키마로 모든 것을 올바르게 스크립팅하려면 테이블을 개별적으로 스크립팅해도 종속성이 올바르게 작동하지 않습니다. 모든 URN을 수집하여 스크립터에게 배열로 전달해야한다는 것을 알았습니다. 예제에서 수정 된이 코드는

    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Sdk.Sfc;
    // etc...

    // Connect to the local, default instance of SQL Server. 
    Server srv = new Server();

    // Reference the database.  
    Database db = srv.Databases["YOURDBHERE"];

    Scripter scrp = new Scripter(srv);
    scrp.Options.ScriptDrops = false;
    scrp.Options.WithDependencies = true;
    scrp.Options.Indexes = true;   // To include indexes
    scrp.Options.DriAllConstraints = true;   // to include referential constraints in the script
    scrp.Options.Triggers = true;
    scrp.Options.FullTextIndexes = true;
    scrp.Options.NoCollation = false;
    scrp.Options.Bindings = true;
    scrp.Options.IncludeIfNotExists = false;
    scrp.Options.ScriptBatchTerminator = true;
    scrp.Options.ExtendedProperties = true;

    scrp.PrefetchObjects = true; // some sources suggest this may speed things up

    var urns = new List<Urn>();

    // Iterate through the tables in database and script each one   
    foreach (Table tb in db.Tables)
    {
        // check if the table is not a system table
        if (tb.IsSystemObject == false)
        {
            urns.Add(tb.Urn);
        }
    }

    // Iterate through the views in database and script each one. Display the script.   
    foreach (View view in db.Views)
    {
        // check if the view is not a system object
        if (view.IsSystemObject == false)
        {
            urns.Add(view.Urn);
        }
    }

    // Iterate through the stored procedures in database and script each one. Display the script.   
    foreach (StoredProcedure sp in db.StoredProcedures)
    {
        // check if the procedure is not a system object
        if (sp.IsSystemObject == false)
        {
            urns.Add(sp.Urn);
        }
    }

    StringBuilder builder = new StringBuilder();
    System.Collections.Specialized.StringCollection sc = scrp.Script(urns.ToArray());
    foreach (string st in sc)
    {
        // It seems each string is a sensible batch, and putting GO after it makes it work in tools like SSMS.
        // Wrapping each string in an 'exec' statement would work better if using SqlCommand to run the script.
        builder.AppendLine(st);
        builder.AppendLine("GO");
    }

    return builder.ToString();


답변

작업 을 수행하는 SchemaZen 이라는 오픈 소스 명령 줄 유틸리티를 작성했습니다 . Management Studio의 스크립팅보다 훨씬 빠르며 출력은 버전 관리에 더 친숙합니다. 스키마와 데이터 모두 스크립팅을 지원합니다.

스크립트를 생성하려면 다음을 실행하십시오.

schemazen.exe 스크립트 --server localhost --database db --scriptDir c : \ somedir

그런 다음 스크립트에서 데이터베이스를 다시 작성하려면 다음을 실행하십시오.

schemazen.exe create --server localhost --database db --scriptDir c : \ somedir


답변

SQL Server 관리 개체 (SMO)를 사용하여 스크립트 생성을 포함한 SQL Server 2005 관리 작업을 자동화 할 수 있습니다. http://msdn.microsoft.com/en-us/library/ms162169.aspx .


답변

개발자라면 확실히 SMO를 선택하십시오. 시작점 인 Scripter 클래스에 대한 링크는 다음과 같습니다.

스크립터 클래스


답변

나는이 답변 중 SQLPSX가 언급 된 powershell을 보지 못합니다 … 개인적으로 그것을 사용하지는 않았지만 사용하기가 아름답고 간단하며 다음과 같은 작업을 통해 이러한 유형의 자동화 작업에 이상적으로 적합합니다.

Get-SqlDatabase -dbname test -sqlserver server | Get-SqlTable | Get-SqlScripter | Set-Content -Path C:\script.sql
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlStoredProcedure | Get-SqlScripter
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlView | Get-SqlScripter

(참조 : http://www.sqlservercentral.com/Forums/Topic1167710-1550-1.aspx#bm1168100 )

프로젝트 페이지 : http://sqlpsx.codeplex.com/

이 접근 방식의 가장 큰 장점은 SMO를 직접 사용하는 구성 / 사용자 지정 가능성과 데이터베이스 게시 마법사와 같은 간단한 기존 도구를 사용하는 편의성과 유지 관리 가능성을 결합한다는 것입니다.


답변

도구> 옵션> 디자이너> 테이블 및 데이터베이스 디자이너에는 저장할 때 변경할 때마다 하나씩 생성하는 ‘변경 스크립트 자동 생성’옵션이 있습니다.