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?
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