2013-10-17 16 views
7

Cơ sở dữ liệu của tôi có các bảng, dạng xem và tất cả. Và tôi cần một cách để tạo ra kịch bản lệnh SQL cho tất cả DDL một cách tự động. Không cần dữ liệu.Cách tạo tập lệnh sql bằng cách sử dụng trình biên dịch SMO

Có các ràng buộc FK để các kịch bản tạo bảng nên được sắp xếp đúng cách. Một số chế độ xem sử dụng chế độ xem khác, do đó, xem các tập lệnh tạo cũng phải được sắp xếp đúng cách.

Bắt đầu từ một kịch bản được trình bày trên MSDN Blog, tôi đã nhận như sau:

function Generate-SqlScript 
{ 
    param(
    [string]$srvname, 
    [string]$database, 
    [string]$ScriptOutputFileName 
    ) 

    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null 

    $srv = New-Object ("Microsoft.SqlServer.Management.SMO.Server") ($srvname) 

    $allUrns = @() 
    $allUrns += $srv.Databases[$database].Tables | foreach { $_.Urn} 
    $allUrns += $srv.Databases[$database].Views | foreach { $_.Urn} 

    $scriptingOptions = New-Object ("Microsoft.SqlServer.Management.SMO.ScriptingOptions") 
    $scriptingOptions.WithDependencies = $true 
    $scriptingOptions.AllowSystemObjects = $false 
    $scriptingOptions.ToFileOnly = $true 
    $scriptingOptions.Permissions = $true 
    $scriptingOptions.FileName = "$ScriptOutputFileName" 

    $scripter = New-Object ("Microsoft.SqlServer.Management.SMO.Scripter") ($srv) 
    $scripter.Options = $scriptingOptions; 

    $scripter.Script($allUrns) 
} 

Generate-SqlScript .\sqlexpress <MyDbName> <FilePath> 

Bây giờ vấn đề là, WithDependencies tùy chọn làm cho kịch bản nhằm bao gồm các bảng phụ thuộc của nó, mà đã được bao gồm trước đó. Nếu tôi đưa ra tùy chọn WithDependencies, tập lệnh được tạo không phản ánh đúng thứ tự.

Vì vậy, kết quả cuối cùng chứa tất cả thông tin, nhưng không thể chạy được. Nó làm tăng một lỗi vì nó không thể tạo bảng hai lần.

Tôi tìm thấy quá nhiều bài viết nói về SMO scripter cho điều này, vì vậy tôi cho rằng có phải là một cái gì đó tôi bị mất. Hay ... tất cả những bài viết đó đều bỏ lỡ vấn đề này?

Trả lời

6

Bạn cần khám phá và sắp xếp các bảng theo thứ tự phụ thuộc trong tập lệnh PowerShell của mình trước khi tạo ra các đối tượng. Xem lại việc triển khai điều này trên blog sau: http://patlau.blogspot.com/2012/09/generate-sqlserver-scripts-with.html

Khái niệm này rõ ràng hơn với tôi trong C#. Kiểm tra: http://sqlblog.com/blogs/ben_miller/archive/2007/10/18/scripting-tables-views-and-data-using-smo-part-3.aspx

1

Bạn có thể thực hiện một cách tiếp cận khác và các bảng tập lệnh và sau đó xem. Nói chung theo thứ tự đó, mọi thứ hoạt động, nhưng không phải 100%.

tôi sẽ thiết lập WithDependencies false

+0

WithDependencies thực hiện hai việc: 1) nó sắp xếp lại các tập lệnh theo sự phụ thuộc. 2) nó bao gồm các phần tử phụ thuộc tự động. Nếu tôi đưa ra WithDependencies, tôi sẽ không gặp bất kỳ vấn đề gì từ # 2 nhưng tôi cần viết tay để đạt đượC# 1. Điều đó có thể thực hiện được, chỉ muốn đảm bảo rằng kỳ vọng được đặt đúng cho bất kỳ ai muốn thực hiện điều này. – kennethc

1

Đó là thừa nhận một hack, nhưng bạn có thể vá các kịch bản trước khi bạn chạy nó bằng cách thêm xử lý lỗi. Bạn có lẽ có thể tận dụng trình phân tích cú pháp mới trong V3 để tự động hóa điều đó.

3
  1. Viết tất cả các bảng không có chìa khóa ngoài, sau đó chỉ viết ra các phím lạ. Bạn có thể làm điều này bằng cách sử dụng các tùy chọn kịch bản, và theo cách này, các phụ thuộc giữa các bảng do các FK sẽ không thành vấn đề.
  2. Sử dụng đối tượng SMO DependencyWalker. Bạn có thể thêm URN cho các khung nhìn vào nó và sau đó yêu cầu một danh sách tuyến tính phụ thuộc. Câu trả lời của tôi here cho một câu hỏi tương tự có chứa một ví dụ về cách sử dụng nó.
+0

Cảm ơn bạn đã trả lời. Tôi "trao" tiền thưởng cho Renegrin nhưng tiền của bạn cũng tốt. Tôi ước có một cách để chia tiền thưởng. Giải pháp của tôi đã kết thúc bằng cách tiếp cận khác nhau vì lý do không liên quan. – kennethc

Các vấn đề liên quan