编写特定模式下的所有SQL对象

时间:2014-09-10 04:26:55

标签: sql sql-server tsql

有没有什么方法可以在模式下编写所有SQL Server对象(表,SP,函数等)?

在我们的数据库中,我们有一个包含所有模式名称的表,并且有超过500个模式。其中一些是dev,有些是prod。我需要编写dev模式下的所有对象并创建一个新数据库。

5 个答案:

答案 0 :(得分:4)

ApexSQL Script是在这种情况下非常有用的工具。它是为数据库对象创建SQL脚本的工具,它可以将所有对象分别编写为一个脚本或所有对象。

对于这种情况,你应该做的是:

  1. 选择要编写脚本并加载它们的服务器和数据库。
  2. 转到“视图”标签,然后点击“对象过滤器”按钮,然后选择“编辑过滤器”按钮:
  3. img1

    1. 在所有对象的过滤器编辑器中,选择“包含if:”和“单击此处添加过滤条件”:
    2. img2

      1. 选择“架构”,“等于”并输入所需的架构名称,然后单击“确定”:
      2. img3

        1. 单击“主页”选项卡,选中所有对象,然后单击“脚本”按钮:
        2. img4

          1. 在“同步”向导的第三步中,在“脚本文件”选项卡下,选择是否要从“粒度”下拉菜单中为所有对象或每个对象单独创建一个脚本:
          2. img5

            1. 在“脚本”向导的最后一步中,单击“创建”按钮并查看结果 - 您将拥有可在SQL Server Management Studio中执行的脚本。

答案 1 :(得分:1)

谢谢你的回复。我通过SSMS生成所有脚本然后创建了一个仅模式数据库来解决这个问题。我删除了所有表,视图SP,函数等,这些不是我不需要的模式的一部分。

这花了我大约20分钟。但毕竟工作完成了。

答案 2 :(得分:1)

这是PowerShell对您的问题的回答。

$Server= 'SERVER_NAME'
$Database= 'DATABASE_NAME'
$SmoScriptPath = 'SCRIPT_OUTPUT.SQL'  
$Schemas = @("dlo", "deo")    # include objects that fall under this schema set
$ObjectTypes = @("StoredProcedures", "Views", "Tables")    #object types to be included 


[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Data") | Out-Null
$SmoServer = new-object "Microsoft.SqlServer.Management.SMO.Server" $Server
$SmoServer.SetDefaultInitFields([Microsoft.SqlServer.Management.SMO.View], "IsSystemObject")
$SmoDb = New-Object "Microsoft.SqlServer.Management.SMO.Database"
$SmoDb = $SmoServer.Databases[$Database]
$SmoScr = New-Object "Microsoft.SqlServer.Management.Smo.Scripter"
$SmoScr.Server = $SmoServer
$SmoScr.Options = New-Object "Microsoft.SqlServer.Management.SMO.ScriptingOptions"
$SmoScr.Options.AllowSystemObjects = $false
$SmoScr.Options.IncludeDatabaseContext = $true
$SmoScr.Options.IncludeIfNotExists = $false
$SmoScr.Options.ClusteredIndexes = $true
$SmoScr.Options.Default = $true
$SmoScr.Options.DriAll = $true
$SmoScr.Options.Indexes = $true
$SmoScr.Options.NonClusteredIndexes = $true
$SmoScr.Options.IncludeHeaders = $false
$SmoScr.Options.ToFileOnly = $true
$SmoScr.Options.AppendToFile = $true
$SmoScr.Options.ScriptDrops = $false 
$SmoScr.Options.Triggers = $true
$SmoScr.Options.ExtendedProperties = $true
$SmoScr.Options.FileName = $SmoScriptPath
New-Item $SmoScr.Options.FileName -type file -force | Out-Null


Foreach ($ObjectType in $ObjectTypes) {
    $Objects = $SmoDb.$ObjectType | where {$_.IsSystemObject -eq $false -and $Schemas.Contains($_.Schema)}

    Foreach ($Object in $Objects | where {$_ -ne $null})
    {        
       $SmoScr.Script($Object)        
    }
}

答案 3 :(得分:1)

如果您正在寻找一种解决方案,以便按计划将这些对象编写脚本并自动检入GIT存储库。

查看我共享的以下项目:https://github.com/Drazzing/mssqlobjectstogit

您得到的是:

  1. 随着时间的推移[GIT]中对MS SQL对象的更改
  2. 该报告显示谁随时间推移[CSV]添加/删除/更改了对象

报告示例: enter image description here

答案 4 :(得分:0)

您可以使用Redgate SQL Compare 要么 使用management studio生成脚本功能。