2010-08-15 4 views
5

Я хотел бы автоматизировать создание сценариев (в SSMS -> Задачи -> Сгенерировать скрипты) в SSMS 2008. Я читал, что SQL Server 2008 не поддерживает мастер публикации базы данных (включая SQLPUBWIZ SCRIPT), но эта автоматизация может быть выполнена используя SMO в SQL Server 2008. У меня нет понятия о SMO и как это сделать с помощью SMO, так что вы могли бы дать мне несколько советов (ресурсов и т. д.), с чего начать?Как автоматизировать создание сценариев с использованием SMO в SQL Server?

+0

возможно дубликат [Автоматизация создания сценариев Мастер в SQL2008] (http://stackoverflow.com/questions/3380195/automate-generate-scripts-wizard-in-sql2008) Или это тоже Http: // StackOverflow .com/вопросы/3384649 – gbn

ответ

10

Ключом к SMO-скрипту является класс Scripter. Все остальные инструменты (например, SSMS) используют этот класс для создания сценариев создания объектов. Существует пример использования на MSDN:

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

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

    //Define a Scripter object and set the required scripting options. 
    Scripter scrp = new Scripter(srv); 
    scrp.Options.ScriptDrops = false; 
    scrp.Options.WithDependencies = true; 

    //Iterate through the tables in database and script each one. Display the script. 
    //Note that the StringCollection type needs the System.Collections.Specialized namespace to be included. 
    Microsoft.SqlServer.Management.Sdk.Sfc.Urn[] smoObjects = new Microsoft.SqlServer.Management.Sdk.Sfc.Urn[1] ; 
    foreach (Table tb in db.Tables) { 
     smoObjects[0] = tb.Urn; 
     if (tb.IsSystemObject == false) { 
     System.Collections.Specialized.StringCollection sc; 
     sc = scrp.Script(smoObjects); 
     foreach (string st in sc) { 
      Console.WriteLine(st); 
     } 
     } 
    } 
} 
4

Там несколько способов написания сценариев все объекты в базе данных, но один из самых простых является к вам Tranfer класс SMO. Вот некоторые PowerShell код сценария из всех объектов:

add-type -AssemblyName "Microsoft.SqlServer.ConnectionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" 
add-type -AssemblyName "Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" 
add-type -AssemblyName "Microsoft.SqlServer.SMOExtended, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" 

$sourceSrv = "$env:computername\sql2k8" 
$sourceDb = "Northwind" 

$server = new-object ("Microsoft.SqlServer.Management.Smo.Server") $sourceSrv 
$db = $server.Databases[$sourceDb] 

$transfer = new-object ("Microsoft.SqlServer.Management.Smo.Transfer") $db 
$transfer.CopyAllObjects = $true 
$transfer.DropDestinationObjectsFirst = $true 
$transfer.CopySchema = $true 
$transfer.Options.IncludeIfNotExists = $true 

$transfer.ScriptTransfer() 
7

Хотя вопрос был точно ответил, я изо всех сил в течение нескольких дней, чтобы собрать сценарий, который по сценарию все объекты, я заботился о том на сервере базы данных. Вот мой код на всякий случай, когда он кому-то полезен в какой-то момент.

# Load needed assemblies 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMOExtended")| Out-Null; 

#Specify target server and databases. 
$sql_server = "SomeServerName" 
$SMOserver = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList "$sql_server" 
$databases = $SMOserver.Databases 
$BaseSavePath = "T:\SomeFilePath\" + $sql_server + "\" 

#Remove existing objects. 
Remove-Item $BaseSavePath -Recurse 

#Script server-level objects. 
$ServerSavePath = $BaseSavePath 
$ServerObjects = $SMOserver.BackupDevices 
$ServerObjects += $SMOserver.Endpoints 
$ServerObjects += $SMOserver.JobServer.Jobs 
$ServerObjects += $SMOserver.LinkedServers 
$ServerObjects += $SMOserver.Triggers 

foreach ($ScriptThis in $ServerObjects | where {!($_.IsSystemObject)}) 
{ 
    #Need to Add Some mkDirs for the different $Fldr=$ScriptThis.GetType().Name 
    $scriptr = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($SMOserver) 
    $scriptr.Options.AppendToFile = $True 
    $scriptr.Options.AllowSystemObjects = $False 
    $scriptr.Options.ClusteredIndexes = $True 
    $scriptr.Options.DriAll = $True 
    $scriptr.Options.ScriptDrops = $False 
    $scriptr.Options.IncludeHeaders = $False 
    $scriptr.Options.ToFileOnly = $True 
    $scriptr.Options.Indexes = $True 
    $scriptr.Options.Permissions = $True 
    $scriptr.Options.WithDependencies = $False 

    <#Script the Drop too#> 
    $ScriptDrop = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($SMOserver) 
    $ScriptDrop.Options.AppendToFile = $True 
    $ScriptDrop.Options.AllowSystemObjects = $False 
    $ScriptDrop.Options.ClusteredIndexes = $True 
    $ScriptDrop.Options.DriAll = $True 
    $ScriptDrop.Options.ScriptDrops = $True 
    $ScriptDrop.Options.IncludeHeaders = $False 
    $ScriptDrop.Options.ToFileOnly = $True 
    $ScriptDrop.Options.Indexes = $True 
    $ScriptDrop.Options.WithDependencies = $False 

    <#This section builds folder structures. Remove the date folder if you want to overwrite#> 
    $TypeFolder=$ScriptThis.GetType().Name 
    if ((Test-Path -Path "$ServerSavePath\$TypeFolder") -eq "true") ` 
      {"Scripting Out $TypeFolder $ScriptThis"} ` 
     else {new-item -type directory -name "$TypeFolder"-path "$ServerSavePath"} 
    $ScriptFile = $ScriptThis -replace ":", "-" -replace "\\", "-" 
    $ScriptDrop.Options.FileName = $ServerSavePath + "\" + $TypeFolder + "\" + $ScriptFile.Replace("]", "").Replace("[", "") + ".sql" 
    $scriptr.Options.FileName = $ServerSavePath + "\" + $TypeFolder + "\" + $ScriptFile.Replace("]", "").Replace("[", "") + ".sql" 

    #This is where each object actually gets scripted one at a time. 
    $ScriptDrop.Script($ScriptThis) 
    $scriptr.Script($ScriptThis) 
} #This ends the object scripting loop at the server level. 


#Script database-level objects. 
foreach ($db in $databases) 
{ 
    $DatabaseObjects = $db.ApplicationRoles 
    $DatabaseObjects += $db.Assemblies 
    $DatabaseObjects += $db.ExtendedStoredProcedures 
    $DatabaseObjects += $db.ExtendedProperties 
    $DatabaseObjects += $db.PartitionFunctions 
    $DatabaseObjects += $db.PartitionSchemes 
    $DatabaseObjects += $db.Roles 
    $DatabaseObjects += $db.Rules 
    $DatabaseObjects += $db.Schemas 
    $DatabaseObjects += $db.StoredProcedures 
    $DatabaseObjects += $db.Synonyms 
    $DatabaseObjects += $db.Tables 
    $DatabaseObjects += $db.Triggers 
    $DatabaseObjects += $db.UserDefinedAggregates 
    $DatabaseObjects += $db.UserDefinedDataTypes 
    $DatabaseObjects += $db.UserDefinedFunctions 
    $DatabaseObjects += $db.UserDefinedTableTypes 
    $DatabaseObjects += $db.UserDefinedTypes 
    $DatabaseObjects += $db.Users 
    $DatabaseObjects += $db.Views 

    #Build this portion of the directory structure out here. Remove the existing directory and its contents first. 
    $DatabaseSavePath = $BaseSavePath + "Databases\" + $db.Name 

    new-item -type directory -path "$DatabaseSavePath" 

    foreach ($ScriptThis in $DatabaseObjects | where {!($_.IsSystemObject)}) 
    { 
     #Need to Add Some mkDirs for the different $Fldr=$ScriptThis.GetType().Name 
     $scriptr = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($SMOserver) 
     $scriptr.Options.AppendToFile = $True 
     $scriptr.Options.AllowSystemObjects = $False 
     $scriptr.Options.ClusteredIndexes = $True 
     $scriptr.Options.DriAll = $True 
     $scriptr.Options.ScriptDrops = $False 
     $scriptr.Options.IncludeHeaders = $False 
     $scriptr.Options.ToFileOnly = $True 
     $scriptr.Options.Indexes = $True 
     $scriptr.Options.Permissions = $True 
     $scriptr.Options.WithDependencies = $False 

     <#Script the Drop too#> 
     $ScriptDrop = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($SMOserver) 
     $ScriptDrop.Options.AppendToFile = $True 
     $ScriptDrop.Options.AllowSystemObjects = $False 
     $ScriptDrop.Options.ClusteredIndexes = $True 
     $ScriptDrop.Options.DriAll = $True 
     $ScriptDrop.Options.ScriptDrops = $True 
     $ScriptDrop.Options.IncludeHeaders = $False 
     $ScriptDrop.Options.ToFileOnly = $True 
     $ScriptDrop.Options.Indexes = $True 
     $ScriptDrop.Options.WithDependencies = $False 

     <#This section builds folder structures. Remove the date folder if you want to overwrite#> 
     $TypeFolder=$ScriptThis.GetType().Name 
     if ((Test-Path -Path "$DatabaseSavePath\$TypeFolder") -eq "true") ` 
       {"Scripting Out $TypeFolder $ScriptThis"} ` 
      else {new-item -type directory -name "$TypeFolder"-path "$DatabaseSavePath"} 
     $ScriptFile = $ScriptThis -replace ":", "-" -replace "\\", "-" 
     $ScriptDrop.Options.FileName = $DatabaseSavePath + "\" + $TypeFolder + "\" + $ScriptFile.Replace("]", "").Replace("[", "") + ".sql" 
     $scriptr.Options.FileName = $DatabaseSavePath + "\" + $TypeFolder + "\" + $ScriptFile.Replace("]", "").Replace("[", "") + ".sql" 

     #This is where each object actually gets scripted one at a time. 
     $ScriptDrop.Script($ScriptThis) 
     $scriptr.Script($ScriptThis) 

    } #This ends the object scripting loop. 
} #This ends the database loop. 
Смежные вопросы