脚本编写

适用于:SQL Server Azure SQL 数据库 azure Synapse Analytics Azure SQL 托管实例

SMO 中的脚本由 Scripter 对象及其子对象 或单个对象的 Script 方法控制。 该 Scripter 对象控制Microsoft SQL Server 实例上对象的依赖项关系映射。

使用 Scripter 对象及其子对象进行的高级脚本撰写是一个由三个阶段组成的过程:

  1. 发现

  2. 生成列表

  3. 脚本生成

发现阶段使用 DependencyWalker 对象。 如果给定对象的 URN 列表,则 DiscoverDependencies 对象的 DependencyWalker 方法将为该 URN 列表中的对象返回 DependencyTree 对象。 布尔 fParents 参数用于选择是要发现指定对象的父对象还是子级。 在此阶段可以修改依赖关系树。

在生成列表阶段,会传入该树并返回生成的列表。 此对象列表是按脚本撰写顺序排列的,可以对其进行操作。

生成列表阶段使用 WalkDependencies 方法返回 DependencyTree。 在此阶段可以修改 DependencyTree

第三阶段也是最后一个阶段,在此阶段中,使用指定的列表和脚本撰写选项生成脚本。 结果以 StringCollection 系统对象的形式返回。 在此阶段中,接下来会从 DependencyTree 对象和属性(如 NumberOfSiblingsFirstChild)的项集合中提取依赖对象的名称。

示例

若要使用所提供的任何代码示例,您必须选择创建应用程序所需的编程环境、编程模板和编程语言。 有关详细信息,请参阅 在 Visual Studio .NET 中创建 Visual C# SMO 项目。

此代码示例需要 System.Collections.Specialized 命名空间的 Imports 语句。 请将此语句与其他 Imports 语句一同插入在应用程序中的任何声明代码前。

Imports Microsoft.SqlServer.Management.Smo  
Imports Microsoft.SqlServer.Management.Common  
Imports System.Collections.Specialized  

在 Visual Basic 中撰写数据库依赖项的脚本

此代码示例说明如何发现依赖项并循环访问列表以显示结果。

' compile with:   
' /r:Microsoft.SqlServer.Smo.dll   
' /r:Microsoft.SqlServer.ConnectionInfo.dll   
' /r:Microsoft.SqlServer.Management.Sdk.Sfc.dll   
  
Imports Microsoft.SqlServer.Management.Smo  
Imports Microsoft.SqlServer.Management.Sdk.Sfc  
  
Public Class A  
   Public Shared Sub Main()  
      ' database name  
      Dim dbName As [String] = "AdventureWorksLT2012"   ' database name  
  
      ' Connect to the local, default instance of SQL Server.   
      Dim srv As New Server()  
  
      ' Reference the database.    
      Dim db As Database = srv.Databases(dbName)  
  
      ' Define a Scripter object and set the required scripting options.   
      Dim scrp As New Scripter(srv)  
      scrp.Options.ScriptDrops = False  
      scrp.Options.WithDependencies = True  
      scrp.Options.Indexes = True   ' To include indexes  
      scrp.Options.DriAllConstraints = True   ' to include referential constraints in the script  
  
      ' Iterate through the tables in database and script each one. Display the script.  
      For Each tb As Table In db.Tables  
         ' check if the table is not a system table  
         If tb.IsSystemObject = False Then  
            Console.WriteLine("-- Scripting for table " + tb.Name)  
  
            ' Generating script for table tb  
            Dim sc As System.Collections.Specialized.StringCollection = scrp.Script(New Urn() {tb.Urn})  
            For Each st As String In sc  
               Console.WriteLine(st)  
            Next  
            Console.WriteLine("--")  
         End If  
      Next  
   End Sub  
End Class  

在 Visual C# 中撰写数据库依赖项的脚本

此代码示例说明如何发现依赖项并循环访问列表以显示结果。

// compile with:   
// /r:Microsoft.SqlServer.Smo.dll   
// /r:Microsoft.SqlServer.ConnectionInfo.dll   
// /r:Microsoft.SqlServer.Management.Sdk.Sfc.dll   
  
using System;  
using Microsoft.SqlServer.Management.Smo;  
using Microsoft.SqlServer.Management.Sdk.Sfc;  
  
public class A {  
   public static void Main() {   
      String dbName = "AdventureWorksLT2012"; // database name  
  
      // Connect to the local, default instance of SQL Server.   
      Server srv = new Server();  
  
      // Reference the database.    
      Database db = srv.Databases[dbName];  
  
      // Define a Scripter object and set the required scripting options.   
      Scripter scrp = new Scripter(srv);  
      scrp.Options.ScriptDrops = false;  
      scrp.Options.WithDependencies = true;  
      scrp.Options.Indexes = true;   // To include indexes  
      scrp.Options.DriAllConstraints = true;   // to include referential constraints in the script  
  
      // Iterate through the tables in database and script each one. Display the script.     
      foreach (Table tb in db.Tables) {   
         // check if the table is not a system table  
         if (tb.IsSystemObject == false) {  
            Console.WriteLine("-- Scripting for table " + tb.Name);  
  
            // Generating script for table tb  
            System.Collections.Specialized.StringCollection sc = scrp.Script(new Urn[]{tb.Urn});  
            foreach (string st in sc) {  
               Console.WriteLine(st);  
            }  
            Console.WriteLine("--");  
         }  
      }   
   }  
}  

在 PowerShell 中撰写数据库依赖项的脚本

此代码示例说明如何发现依赖项并循环访问列表以显示结果。

# Set the path context to the local, default instance of SQL Server.  
CD \sql\localhost\default  
  
# Create a Scripter object and set the required scripting options.  
$scrp = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Scripter -ArgumentList (Get-Item .)  
$scrp.Options.ScriptDrops = $false  
$scrp.Options.WithDependencies = $true  
$scrp.Options.IncludeIfNotExists = $true  
  
# Set the path context to the tables in AdventureWorks2022.  
  
CD Databases\AdventureWorks2022\Tables  
  
foreach ($Item in Get-ChildItem)  
 {    
 $scrp.Script($Item)  
 }