SQL Server Management Studio 2008에서 "스크립트 생성"작업을 자동화하려면 어떻게해야합니까?


97

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

지금 내가하는 일은 :

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

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

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


답을 찾았습니까? 나도 이것을하고 싶다. 나는 Publishing을 사용했다. 그것은 열심히 저장했다. 스크립트를 생성 할 때 모든 옵션이있는 곳을 모르고있다 :-?
Alexa Adrian

1
여러 답변에서 언급했듯이 개발자 인 경우 SMO 사용
Jay Jay Jay

답변:


31

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에서 사용하는 것과 동일한 형식입니다.


2012 년에도 이에 상응하는 것이 있습니까? 마법사가 "스크립트 색인"과 같은 내 설정을 기억한다면 기쁠 것입니다.
PeterX

6
@PeterX SMSS> 도구> 옵션> SQL Server 개체 탐색기> 스크립팅
zanlok 2015 년


@zanlok 매우 유용한 댓글입니다. 불행히도 SQL Server 2014에서 "Include unsupported statements"옵션이 없습니다.
jk7

42

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

9
Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizard어셈블리 C : \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ Microsoft.SqlServer.Management.SqlScriptPublishUI.dll 에서 클래스 를 볼 수 있습니다 . 이것이 SSMS가 사용하는 것입니다. (또는 Microsoft.SqlServer.Management.UI.GenerateScript어셈블리 C : \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ ReplicationDialog.dll 에서 클래스 를 볼 수 있습니다.)
cubetwo1729 2013

여기에있는 예제 코드와 링크는 좋은 시작이었으며 OP에 대한 가장 완전한 대답이어야합니다 (정확한 질문이기도합니다).
zanlok

1
Linux의 명령 줄에서 SQL 서버 스크립트를 생성 할 수있는 C # 앱을 함께 해킹했습니다. .Net Core 2 미리보기 만 있으면됩니다
mkurz

20

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

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

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

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

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

방금 SchemaZen을 사용해 보았는데 정말 감명 받았습니다. 처음으로 일했습니다. 감사합니다 Seth!
Simon Hughes

@Seth 그래서 당신은 객체를 스크립트하기 위해 무엇을 사용하고 있습니까? Microsoft.SqlServer에 대한 단일 참조를 보지 못했습니다 (사용하지 않는 단일 using 문이 있음).
John

@John-Schema Zen에는 스크립팅을위한 자체 라이브러리가 포함되어 있습니다. 스키마를 모델로 읽어 들인 다음 모델을 기반으로 스크립트를 생성합니다. 간단한 예는 github.com/sethreno/schemazen/blob/master/model/Models/… 를 참조하십시오 .
Seth Reno



7

나는이 답변 중 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를 직접 사용하는 구성 / 사용자 지정 가능성과 데이터베이스 게시 마법사와 같은 간단한 기존 도구를 사용하는 편의성과 유지 관리 가능성을 결합한다는 것입니다.


1
이 솔루션을 시도하는 데 시간을 보냈지 만 결국 C #으로 전환하고 SMO를 사용했습니다. 과거의 길을 쉽게 찾을 수 없었던 문제는 예제 코드가 각 테이블을 개별적으로 스크립트한다는 것입니다. 외래 키와 같은 'DRI'(Declarative Referential Integrity) 개체를 추가하기 시작하면 종속성이 올바르게 설정되지 않거나 매우 느려집니다.
OlduwanSteve 2012

4

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


3
그것은 정확히 내가 필요한 것이 아닙니다. 생성 스크립트를 받고 싶습니다 (최종 목표는 해당 파일을 소스 제어 시스템에 자동으로 체크인하는 것입니다)
Brann

3

INFORMATION_SCHEMA 테이블을 사용하여 T-SQL 코드로 수행 할 수 있습니다.

타사 도구도 있습니다. 사용자가 말하는 용도에 정확히 맞는 Apex SQL 스크립트를 좋아합니다. 명령 줄에서 완전히 실행합니다.


3

시도 T-SQL 스크립트를 생성 할 수있는 새로운 SQL 서버의 명령 줄 도구 와 동적 관리 뷰를 모니터링합니다.

매력처럼 나를 위해 일했습니다. 명령 줄에서 실행되는 Microsoft의 새로운 Python 기반 도구입니다. 모든 것이 Microsoft 페이지에 설명 된대로 작동합니다 (아래 링크 참조). SQL 2012 서버에서 저를 위해 일했습니다.

pip로 설치합니다.

$ pip 설치 mssql-scripter

도움말을 위해 h를 사용하여 평소와 같이 명령 매개 변수 개요 :

mssql 스크립터 -h

힌트 : Windows 인증을 통해 SQL-Server에 로그인하는 경우 사용자 이름과 암호는 그대로 두십시오.

https://cloudblogs.microsoft.com/sqlserver/2017/05/17/try-new-sql-server-command-line-tools-to-generate-t-sql-scripts-and-monitor-dynamic-management- 견해/


2

Microsoft 솔루션을 원하면 다음을 시도해 볼 수 있습니다. Microsoft SQL Server 데이터베이스 게시 마법사 1.1

http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

스크립트를 다시 빌드해야 할 때마다 실행할 수있는 배치 프로세스를 생성합니다.


1
불행히도 SqlServer 2008을 지원하지 않습니다
Brann

1
버전 1.2는 2000과 2005를 지원한다고 말했지만 2008 년에 3800 개 이상의 테이블로 데이터베이스를 스크립팅하는 데 사용했고 제대로 작동했습니다. 2008 년까지 소개되지 않은 압축 옵션은 포함되지 않았습니다. 2008 R2 데이터베이스에 대해 방금 테스트했으며 스크립트도 잘 작동합니다.
Jeremy

2

나는 DB Comparer-그것의 자유롭고 소란스럽지 않은 전체 DB를 사용하고 있으며 다른 DB와 비교할 수 있으며 Diff 스크립트도 생성 할 수 있습니다. 개발에서 프로덕션으로의 변경 스크립트에 탁월합니다. http://www.dbcomparer.com/



0

Visual Studio 2008 SP1 TeamSuite에서 :

서버 탐색기 / 데이터 연결 탭에는 "Microsoft SQL Server 데이터베이스 게시 마법사"와 동일하지만 MS Sql Server 2008과 호환되는 공급자에 게시 도구가 있습니다.


작업 자동화에 어떤 도움이됩니까?
Serge Wautier

0

VS 2012 (MSSQL Server 2008의 DB 용)를 사용하고 있습니다. 비교 데이터베이스에는 저장 옵션, 비교 및 ​​옵션이 있습니다. 이것은 본질적으로 전달에 대한 설정입니다. 그 후에 업데이트하거나 스크립트를 생성 할 수 있습니다.

솔루션 탐색기에서 파일을 볼 수 없기 때문에 나중에 파일에서로드 (Windows 탐색기에서 끌어서 놓기)하는 것이 조금 어색합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.