Scripting out individual objects from SQL using SMO

前端 未结 2 1905
小鲜肉
小鲜肉 2021-01-15 21:45

For my job I often have to script out a table with all its keys, constraints and Triggers (basically a full script to recreate the table) from a Microsoft SQL 2008 server.I

相关标签:
2条回答
  • 2021-01-15 22:25

    Here's a script to backup an individual object. Simply pass the object name to the function:

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

    0 讨论(0)
  • 2021-01-15 22:48

    Here is a PowerShell function I use whenever I have to script a database. It should be easy to modify just to scripts the objects you need.

    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): $_"
        }
    }
    
    0 讨论(0)
提交回复
热议问题