![]() Monitoring Server EventsSQL Server Database Engine exposes certain internal events via its WMI provider. Clients using SMO can optionally subscribe to these events and have them routed to a particular object of interest to monitor any changes made externally to an object, such as monitoring for table structure changes, audit logins, and so on. The Internal SMO event routing mechanism is shown in Figure 11-6. Notice how events can be aggregated at the higher-level object. For example, any table object event such as creation of an index can be propagated to the database object or even to the server object, depending upon the level at which you sign up for it. Figure 11-6. Server events.
To help refine your understanding of this sort of monitoring, let's examine some server monitoring scenarios. Monitor Table Create/Drop Events at the Server Instance LevelTo set up monitoring of table create/drop events at the server instance level, begin by declaring an event callback function that prints the contents of each event to the console. Visual Basic .NETPrivate Sub OnDdlEvent(ByVal sender As Object, ByVal args As ServerEventArgs) SyncLock Me Console.WriteLine("------ {0} ------", args.EventType.ToString()) Console.WriteLine("SPID : {0}", args.Spid) Console.WriteLine("Time : {0}", args.PostTime) Console.WriteLine("Instance: {0}", args.SqlInstance) Console.WriteLine() For Each EventProperty entry in args.Properties Dim valueType As String If entry.Value Is Nothing Then valueType = String.Empty Else valueType = Entry.Value.GetType().ToString() End If Console.WriteLine("{0,25}: {1} ({2})", entry.Name, entry.Value, valueType) Next End SyncLock End Sub C# .NETpublic void OnServerEvent (object sender, ServerEventArgs args) { lock (this) { Console.WriteLine("------ {0} ------", args.EventType.ToString()); Console.WriteLine("SPID : {0}", args.Spid); Console.WriteLine("Time : {0}", args.PostTime); Console.WriteLine("Instance: {0}", args.SqlInstance); Console.WriteLine(); foreach(EventProperty entry in args.Properties) { Console.WriteLine("{0,25}: {1} ({2})", entry.Name, entry.Value, (entry Next, simply subscribe to events and start monitoring: Visual Basic .NETDim serverEventSetInstance As New ServerEventSet serverEventSetInstance.CreateTable = True serverEventSetInstance.DropTable = True Dim serverEventHandlerInstance As ServerEventHandler serverEventHandlerInstance = New ServerEventHandler(AddressOf OnServerEvent) serverInstance.Events.SubscribeToEvents(serverEventSetInstance, serverEventHandlerInstance) serverInstance.Events.StartEvents(); C# .NETserverInstance.Events.ServerEvent += new ServerEventHandler(this. OnServerEvent); serverInstance.Events.SubscribeToEvents(ServerEvent.CreateTable); serverInstance.Events.SubscribeToEvents(ServerEvent.DropTable); serverInstance.Events.StartEvents(); Upon program exit make sure you unsubscribe to all events: serverInstance.Events.UnsubscribeAllEvents(); Monitor an Index Creation Event on a Table Object LevelUsing a previously declared event handler function, you can subscribe to an index creation event as follows: Visual Basic .NETDim tableInstance As Table tableInstance = serverInstance.Databases("pubs"). Tables("authors") Dim tableEventSetInstance As New TableEventSet tableEventSetInstance.CreateIndex = True Dim serverEventHandlerInstance As ServerEventHandler serverCreateEventHandler = New ServerEventHandler(AddressOf OnServerEvent) serverInstance.Events.SubscribeToEvents(tableEventSetInstance, serverEventHandlerInstance) tableInstance.Events.StartEvents(); C# .NETTable table = serverInstance.Databases["pubs"].Tables["authors"]; table.Events.SubscribeToEvents(TableEvent.CreateIndex); table.Events.ServerEvent += new ServerEventHandler(OnServerEvent); table.Events.StartEvents(); Monitoring a Trigger Alter or Drop at the Object LevelSMO enables you to monitor for any external modifications to a database object, provided your application that is calling into the SMO function is running while modification is taking place. Visual Basic .NETDim db As Database Dim trig As Trigger db = serverInstance.Databases("AdventureWorks") trig = db.Tables("Address", "Person").Triggers("TRIG_ADDRESS") Dim triggerEventSet As New ObjectEventSet triggerEventSet.Alter = True triggerEventSet.Drop = True Dim serverEventHandlerInstance As ServerEventHandler serverCreateEventHandler = New ServerEventHandler(AddressOf OnServerEvent) serverInstance.Events.SubscribeToEvents(triggerEventSet, serverEventHandlerInstance) trig.Events.StartEvents(); C# .NETDatabase db = serverInstance.Databases["AdventureWorks"]; Trigger trigger = db.Tables["Address", "Person"].Triggers["TRIG_ADDRESS"]; trigger.Events.ServerEvent += new ServerEventHandler(this.OnServerEvent); trigger.Events.SubscribeToEvents(ObjectEvent.Alter + ObjectEvent.Drop); trigger.Events.StartEvents(); ![]() |