处理 SMO 事件

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

某些服务器事件类型可以通过使用事件处理程序和 ServerConnection 对象来进行订阅。

SQL Server 管理对象(SMO)中的许多实例类可以在服务器上执行某些操作时触发事件。

通过设置事件处理程序并订阅相关事件,可以以编程方式对这些事件进行处理。 这种事件处理只是暂时性的,因为当 SMO 客户端程序退出时会删除所有的订阅。

ConnectionContext 事件处理

ServerConnection 对象支持若干种事件类型。 事件属性必须设置为相应事件处理程序的实例,且必须将事件处理程序对象定义为用于处理事件的受保护函数。

事件订阅

您可以通过以下方法处理事件:编写事件处理程序类,创建该类的实例,将事件处理程序分配给父对象,然后订阅事件。

必须编写事件处理程序类才能处理事件。 事件处理程序类可以包含多个事件处理程序函数,且只有在安装事件处理程序类后才能处理事件。 事件处理程序函数从 ServerEventNotificatificationArgs 参数接收有关事件的信息,该参数可用于报告有关事件的信息。

可以处理的数据库和服务器事件的类型在类和ServerEventSet类中DatabaseEventSet列出。

示例

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

在 .NET 中注册事件处理程序并订阅事件处理

以下代码示例演示如何在 .NET 中设置事件处理程序以及如何订阅数据库事件。

Visual Basic

此代码示例演示如何设置事件处理程序以及如何订阅数据库事件。

'Create an event handler subroutine that runs when a table is created.
Private Sub MyCreateEventHandler(ByVal sender As Object, ByVal e As ServerEventArgs)
    Console.WriteLine("A table has just been added to the AdventureWorks2022 database.")
End Sub

'Create an event handler subroutine that runs when a table is deleted.
Private Sub MyDropEventHandler(ByVal sender As Object, ByVal e As ServerEventArgs)
    Console.WriteLine("A table has just been dropped from the AdventureWorks2022 database.")
End Sub

Sub Main()
    'Connect to the local, default instance of SQL Server.

    Dim srv As Server
    srv = New Server

    'Reference the AdventureWorks2022 database.
    Dim db As Database
    db = srv.Databases("AdventureWorks2022")

    'Create a database event set that contains the CreateTable event only.
    Dim databaseCreateEventSet As New DatabaseEventSet
    databaseCreateEventSet.CreateTable = True

    'Create a server event handler and set it to the first event handler subroutine.
    Dim serverCreateEventHandler As ServerEventHandler
    serverCreateEventHandler = New ServerEventHandler(AddressOf MyCreateEventHandler)

    'Subscribe to the first server event handler when a CreateTable event occurs.
    db.Events.SubscribeToEvents(databaseCreateEventSet, serverCreateEventHandler)

    'Create a database event set that contains the DropTable event only.
    Dim databaseDropEventSet As New DatabaseEventSet
    databaseDropEventSet.DropTable = True

    'Create a server event handler and set it to the second event handler subroutine.
    Dim serverDropEventHandler As ServerEventHandler
    serverDropEventHandler = New ServerEventHandler(AddressOf MyDropEventHandler)

    'Subscribe to the second server event handler when a DropTable event occurs.
    db.Events.SubscribeToEvents(databaseDropEventSet, serverDropEventHandler)

    'Start event handling.
    db.Events.StartEvents()

    'Create a table on the database.
    Dim tb As Table
    tb = New Table(db, "Test_Table")

    Dim mycol1 As Column
    mycol1 = New Column(tb, "Name", DataType.NChar(50))
    mycol1.Collation = "Latin1_General_CI_AS"
    mycol1.Nullable = True

    tb.Columns.Add(mycol1)
    tb.Create()

    'Remove the table.
    tb.Drop()

    'Wait until the events have occurred.
    Dim x As Integer
    Dim y As Integer
    For x = 1 To 1000000000
        y = x*2
    Next

    'Stop event handling.
    db.Events.StopEvents()
End Sub