View a markdown version of this page

匯出 SQL Server 資料庫物件 - AWS 資料庫遷移服務

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

匯出 SQL Server 資料庫物件

對於離線來源,您可以上傳描述來源資料庫物件的匯出指令碼檔案。您可以使用任何可用的工具匯出它們。下列索引標籤說明兩種方法:SQL Server Management Studio (SSMS) 和 SQL Server Management Objects (SMO)。

SSMS
  1. 在 SSMS 的 Object Explorer 中,以滑鼠右鍵按一下要匯出的資料庫。選擇任務,然後選擇產生指令碼

  2. 選擇儲存為指令碼檔案

  3. 要產生的檔案下,選擇每個物件一個指令碼檔案,為每個資料庫物件建立個別.sql檔案。

  4. 目錄名稱中,輸入輸出檔案目錄的路徑。我們建議您建立與資料庫同名的目錄。

  5. 針對另存新檔,選擇 Unicode 文字

  6. 選擇進階以開啟進階指令碼選項對話方塊。

  7. 根據下表設定選項。

  8. 選擇確定,然後選擇下一步以檢閱摘要。

  9. 選擇下一步以產生指令碼。

  10. 選擇完成以關閉精靈。

進階指令碼選項

進階指令碼選項對話方塊中設定下列選項。

一般選項
選項 Value
ANSI 填補False
附加至 檔案False
檢查物件是否存在False
在錯誤上繼續編寫指令碼True
將 UDDTs轉換為基本類型False
產生相依物件的指令碼True
包含描述性標頭False
包含指令碼參數標頭False
包含系統限制名稱False
結構描述限定物件名稱True
指令碼繫結False
指令碼定序True
指令碼預設值True
指令碼 DROP 和 CREATE指令碼 CREATE
指令碼延伸屬性True
指令碼登入False
指令碼物件層級許可False
指令碼擁有者False
指令碼統計資料請勿編寫統計資料的指令碼
指令碼使用資料庫True
要指令碼的資料類型僅限結構描述
資料表/檢視選項
選項 Value
指令碼變更追蹤False
指令碼檢查限制條件True
指令碼資料壓縮選項False
指令碼外部金鑰True
指令碼全文索引True
指令碼索引True
指令碼主索引鍵True
指令碼觸發條件True
指令碼唯一金鑰True
SMO

SQL Server 管理物件 (SMO) 是用於以程式設計方式管理 SQL Server 的 .NET API。您可以使用 SMO 搭配 PowerShell 或 C# 來編寫資料庫物件的指令碼,並產生 DDL 檔案以搭配離線來源使用。

先決條件

  • Windows PowerShell 5.1 或更新版本,或 PowerShell 7+

  • SqlServer PowerShell 模組 (使用 安裝Install-Module SqlServer)

  • .NET Framework 4.6.2 或更新版本,或跨平台的 .NET 6+

金鑰指令碼組態

當您使用 SMO 匯出離線來源的指令碼時,請設定下列指令碼選項:

必要的 SMO 指令碼選項
選項 Value
ToFileOnlyTrue
EncodingUnicode
AppendToFileFalse
IncludeHeadersTrue
IncludeDatabaseContextTrue
SchemaQualifyTrue
AnsiPaddingTrue
DefaultTrue
DriAllTrue
IndexesTrue
TriggersTrue
FullTextIndexesTrue
ExtendedPropertiesTrue
ScriptDataCompressionTrue
ScriptDropsFalse
IncludeIfNotExistsFalse
WithDependenciesFalse
NoCollationTrue
PermissionsFalse
ContinueScriptingOnErrorTrue

PowerShell 指令碼範例

下列指令碼會將所有資料庫物件匯出至個別.sql檔案。每個檔案包含單一資料庫物件的一個CREATE陳述式。

# Export SQL Server database objects using SMO # Usage: .\Export-Database.ps1 -Database "MyDB" -OutputDir "C:\export\MyDB" param( [string] $ServerInstance = "localhost", # SQL Server instance name [Parameter(Mandatory)] [string] $Database, # Database to export [Parameter(Mandatory)] [string] $OutputDir, # Output directory for .sql files [switch] $TrustServerCertificate # Skip certificate validation ) $ErrorActionPreference = "Stop" # Load the SqlServer module (includes SMO assemblies) Import-Module SqlServer -ErrorAction Stop # Connect to SQL Server $srv = New-Object Microsoft.SqlServer.Management.Smo.Server($ServerInstance) $srv.ConnectionContext.EncryptConnection = $true if ($TrustServerCertificate) { $srv.ConnectionContext.TrustServerCertificate = $true } # Get the database $db = $srv.Databases[$Database] if (-not $db) { Write-Error "Database '$Database' not found."; exit 1 } if (-not (Test-Path $OutputDir)) { New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null } # Configure scripting options for offline source compatibility $scripter = New-Object Microsoft.SqlServer.Management.Smo.Scripter($srv) $opts = $scripter.Options $opts.ToFileOnly = $true # Write directly to files $opts.Encoding = [System.Text.Encoding]::Unicode # Unicode encoding $opts.AppendToFile = $false # One object per file $opts.IncludeHeaders = $true # Add descriptive headers $opts.IncludeDatabaseContext = $true # Add USE [database] statement $opts.SchemaQualify = $true # Use schema.object format $opts.AnsiPadding = $true # Include ANSI_PADDING settings $opts.Default = $true # Include default constraints $opts.DriAll = $true # Include all constraints and keys $opts.Indexes = $true # Include indexes $opts.Triggers = $true # Include triggers $opts.FullTextIndexes = $true # Include full-text indexes $opts.ExtendedProperties = $true # Include extended properties $opts.ScriptDataCompression = $true # Include data compression settings $opts.ScriptDrops = $false # CREATE only, no DROP statements $opts.IncludeIfNotExists = $false # No IF NOT EXISTS wrapper $opts.WithDependencies = $false # Do not script dependent objects $opts.NoCollation = $true # Omit collation clauses $opts.Permissions = $false # Omit permissions $opts.ContinueScriptingOnError = $true # Skip errors, continue with next object # Define which object types to export $collections = [ordered]@{ "Schemas" = "Schema" "Tables" = "Table" "Views" = "View" "StoredProcedures" = "StoredProcedure" "UserDefinedFunctions" = "UserDefinedFunction" "Sequences" = "Sequence" "Synonyms" = "Synonym" "UserDefinedDataTypes" = "UserDefinedDataType" "UserDefinedTableTypes" = "UserDefinedTableType" "UserDefinedTypes" = "UserDefinedType" "UserDefinedAggregates" = "UserDefinedAggregate" "XmlSchemaCollections" = "XmlSchemaCollection" "Rules" = "Rule" "Defaults" = "Default" "PartitionSchemes" = "PartitionScheme" "PartitionFunctions" = "PartitionFunction" "Assemblies" = "SqlAssembly" "FullTextCatalogs" = "FullTextCatalog" "FullTextStopLists" = "FullTextStopList" "SearchPropertyLists" = "SearchPropertyList" "SecurityPolicies" = "SecurityPolicy" "ExternalDataSources" = "ExternalDataSource" "ExternalFileFormats" = "ExternalFileFormat" } # System schemas to skip $sysSchemas = 'dbo','guest','INFORMATION_SCHEMA','sys', 'db_owner','db_accessadmin','db_securityadmin','db_ddladmin', 'db_backupoperator','db_datareader','db_datawriter', 'db_denydatareader','db_denydatawriter' # Export the CREATE DATABASE statement $dbScripter = New-Object Microsoft.SqlServer.Management.Smo.Scripter($srv) $dbScripter.Options.ToFileOnly = $true $dbScripter.Options.Encoding = [System.Text.Encoding]::Unicode $dbScripter.Options.IncludeDatabaseContext = $true $dbScripter.Options.FileName = Join-Path $OutputDir "$Database.Database.sql" $dbScripter.Script($db) # Export each object to a separate .sql file foreach ($colName in $collections.Keys) { $col = $db.$colName if (-not $col -or $col.Count -eq 0) { continue } foreach ($obj in $col) { # Skip system objects if ($obj.PSObject.Properties['IsSystemObject'] -and $obj.IsSystemObject) { continue } if ($colName -eq "Schemas" -and $obj.Name -in $sysSchemas) { continue } # Build the output file name: schema.objectname.type.sql $schema = if ($obj.PSObject.Properties['Schema']) { $obj.Schema } else { "" } $safeName = $obj.Name -replace '[\\/:*?"<>|]', '_' $fileName = if ($schema) { "$schema.$safeName.$($collections[$colName]).sql" } else { "$safeName.$($collections[$colName]).sql" } $opts.FileName = Join-Path $OutputDir $fileName $scripter.Script($obj) } }