【问题标题】:Scripting out individual objects from SQL using SMO使用 SMO 从 SQL 中编写单个对象的脚本
【发布时间】:2012-10-18 06:48:22
【问题描述】:

对于我的工作,我经常需要从 Microsoft SQL 2008 服务器编写包含所有键、约束和触发器的表(基本上是重新创建表的完整脚本)。我还必须为过程和触发器执行此操作。 我现在要做的是打开 SSMS 右键单击​​对象并选择脚本并选择将其脚本写入文件。因此,如果我有 3 个程序要做,10 个表和 1 个触发器,我最终会这样做 14 次。 我想要的是一个 powershell 脚本,我可以将一个对象列表提供给它,然后它会使用 SMO 将每个脚本写入一个单独的文件。

感谢您的帮助

【问题讨论】:

    标签: sql sql-server powershell smo


    【解决方案1】:

    这是我在编写数据库脚本时使用的 PowerShell 函数。它应该很容易修改为您需要的对象的脚本。

    function SQL-Script-Database
    {
        <#
        .SYNOPSIS
        Script all database objects for the given database.
    
        .DESCRIPTION
        This  function scripts all database objects  (i.e.: tables,  views, stored
        procedures,  and user defined functions) for the specified database on the
        the given server\instance. It creates a subdirectory per object type under 
        the path specified.
    
        .PARAMETER savePath
        The root path where to save object definitions.
    
        .PARAMETER database
        The database to script (default = $global:DatabaseName)
    
        .PARAMETER DatabaseServer 
        The database server to be used (default: $global:DatabaseServer).
    
        .PARAMETER InstanceName 
        The instance name to be used (default: $global:InstanceName).
    
        .EXAMPLE
        SQL-Script-Database c:\temp AOIDB
        #>
    
        param (
            [parameter(Mandatory = $true)][string] $savePath,
            [parameter(Mandatory = $false)][string] $database = $global:DatabaseName,
            [parameter(Mandatory = $false)][string] $DatabaseServer = $global:DatabaseServer,
            [parameter(Mandatory = $false)][string] $InstanceName = $global:InstanceName
        )
    
        try
        {
            if (!$DatabaseServer -or !$InstanceName)
                { throw "`$DatabaseServer or `$InstanceName variable is not properly initialized" }
    
            $ServerInstance = SQL-Get-Server-Instance $DatabaseServer $InstanceName
    
            [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
    
            $s = New-Object Microsoft.SqlServer.Management.Smo.Server($ServerInstance)
            $db = $s.databases[$database]
    
            $objects = $db.Tables
            $objects += $db.Views
            $objects += $db.StoredProcedures
            $objects += $db.UserDefinedFunctions
    
            $scripter = New-Object ('Microsoft.SqlServer.Management.Smo.Scripter') ($s)
    
            $scripter.Options.AnsiFile = $true
            $scripter.Options.IncludeHeaders = $false
            $scripter.Options.ScriptOwner = $false
            $scripter.Options.AppendToFile = $false
            $scripter.Options.AllowSystemobjects = $false
            $scripter.Options.ScriptDrops = $false
            $scripter.Options.WithDependencies = $false
            $scripter.Options.SchemaQualify = $false
            $scripter.Options.SchemaQualifyForeignKeysReferences = $false
            $scripter.Options.ScriptBatchTerminator = $false
    
            $scripter.Options.Indexes = $true
            $scripter.Options.ClusteredIndexes = $true
            $scripter.Options.NonClusteredIndexes = $true
            $scripter.Options.NoCollation = $true
    
            $scripter.Options.DriAll = $true
            $scripter.Options.DriIncludeSystemNames = $false
    
            $scripter.Options.ToFileOnly = $true
            $scripter.Options.Permissions = $true
    
            foreach ($o in $objects | where {!($_.IsSystemObject)}) 
            {
                $typeFolder=$o.GetType().Name 
    
                if (!(Test-Path -Path "$savepath\$typeFolder")) 
                    { New-Item -Type Directory -name "$typeFolder"-path "$savePath" | Out-Null }
    
                $file = $o -replace "\[|\]"
                $file = $file.Replace("dbo.", "")
    
                $scripter.Options.FileName = "$savePath\$typeFolder\$file.sql"
                $scripter.Script($o)
            }
        }
    
        catch
        {
            Util-Log-Error "`t`t$($MyInvocation.InvocationName): $_"
        }
    }
    

    【讨论】:

    • 我试过了,它可以工作,但我如何只指定一个表或对象列表,例如脚本 proc1,table2,proc4,table6 。我是 smo 新手,所以不知道它是怎么做的作品
    • 所有要编写脚本的对象首先收集在 $objects 列表中。您可以在 foreach 之前过滤该列表以仅保留您想要的对象。
    【解决方案2】:

    这是一个备份单个对象的脚本。只需将对象名称传递给函数:

    http://sev17.com/2012/04/backup-database-object/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 2011-02-18
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      相关资源
      最近更新 更多