接着前面提到过的如何写Event Log到NT Server一文,此处将实现Store procedure中写Event Log到NT Server的功能。 其实,写Event Log到NT Server还是采用VB COM实现,而在此处所做的是在Store procedure中调用该VB COM。 首先介绍几个SQL Server自带的Store Procedure。 1:sp_OACreate 建立自动操作对象的一个实例 这里自动操作对象可以是 ActiveX EXE、COM、Shell等。其中还可以利用wscript.Shell进行入侵攻击(扯远了)。 可以采用如下方式创建COM: EXEC @hr = sp_OACreate ''''EventRecord.EventRecorder'''',@EventRecorder OUTPUT 这里EventRecord.EventRecorder即为VB编写的COM类,@EventRecorder为返回值,返回值为 int 型。之后的操作都将围绕该@EventRecorder进行,可以看作为Store Procedure中的一个对象。@hr为sp_OACreate调用返回值,若@hr=0则表示创建成功,否则失败。常用作出错处理。 2:sp_OADestroy 释放一个对象的实例 在对创建的对象操作完成之后需要释放资源,可以采用如下方式: EXEC sp_OADestroy @EventRecorder 3:sp_OAGetErrorInfo 从其他过程返回的HResult中获得错误信息 主要用作错误处理。 4:sp_OAGetProperty 把对象的属性存储在结果集或局部变量中 实现与对象的通信。如: EXEC sp_OAGetProperty @EventRecorder,''''Source'''',@EventSource OUTPUT 实现获取EventRecorder对象中的Source属性的值并放入到@EventSource变量中 5:sp_OASetProperty 对对象的属性进行赋值处理,将会改变对象的该属性值 实现与对象的通信。如: EXEC sp_OASetProperty @EventRecorder,''''Source'''',@EventSource 实现设置@EventRecorder对象的Source属性,将Source属性设定为@EventSource变量的值。 6:sp_OAMethod 实现对象的方法的调用 向对象的方法传递参数,并得到返回值。 有参数有返回值:如 EXEC sp_OAMethod @EventRecorder,''''WriteEventLog'''',@ResultValue OUTPUT, @EventMessage=@EventMessage,@EventType=@EventType, @EventID=@EventID,@EventCategory=@EventCategory 无参数有返回值:如 EXEC sp_OAMethod @EventRecorder,''''WriteEventLog'''',@ResultValue OUTPUT 无参数无返回值:如 EXEC sp_OAMethod @EventRecorder,''''WriteEventLog'''',NULL 7:sp_OAStop 关闭SQL Server的自动存储过程 关闭SQL Server对COM的自动操作环境,无须任何参数。不是必须的,因为第一次调用sp_OACreate时会自动开启自动操作环境,SQL Server关闭时,该自动环境也会自动关闭。另外,如果一个存储过程正在对一个COM对象进行操作,而另一个存储过程关闭了该自动环境,则会出现错误,所以不建议采用这种方式。 OK,至此,对于操作COM所必须的知识已经足够了。 下面是本次实现的例子: /* ** Write Event Log To NT Event Viewer */ CREATE PROCEDURE dbo.sp_EventRecorder ( @EventSource nvarchar(100), ----Event Source @EventID int, ----Event ID , please refer the <Application ID document> @EventType int, ----Event Type , 0--Information;1--Error;2--Warning @EventMessage nvarchar(2000), ----Event Message,the Error Content @EventCategory int = 0, ----Event Category ,default 0 @ReturnValue int OUTPUT ----Return Value 0--Success;1--Fail ) AS DECLARE @EventMachineName nvarchar(100), @EventRecorder int, @hr int, @ResultValue nvarchar(10) BEGIN ----Set Event Log Server Name,'''' '''' Means Local Machine,Need To Config SET @EventMachineName = '''' '''' END ----Create EventRecorder Object EXEC @hr = sp_OACreate ''''EventRecord.EventRecorder'''',@EventRecorder OUTPUT IF @hr = 0 BEGIN ----Set Method 0--Write To Event Viewer;1--Write To DataBase.Default 0 EXEC @hr = sp_OASetProperty @EventRecorder,''''Method'''',0 IF @hr <> 0 GOTO ErrorHandle ----Set Machine Name of Event Log Server,Default Local Server EXEC @hr = sp_OASetProperty @EventRecorder,''''MachineName'''',@EventMachineName IF @hr <> 0 GOTO ErrorHandle ----Set Event Source,Must to do it! EXEC @hr = sp_OASetProperty @EventRecorder,''''Source'''',@EventSource IF @hr <> 0 GOTO ErrorHandle ----Write Event Log EXEC @hr = sp_OAMethod @EventRecorder,''''WriteEventLog'''',@ResultValue OUTPUT, @EventMessage=@EventMessage,@EventType=@EventType, @EventID=@EventID,@EventCategory=@EventCategory IF @hr <> 0 GOTO ErrorHandle ----Check if write successfully! IF @ResultValue = ''''True'''' BEGIN SET @ReturnValue = 0 EXEC sp_OADestroy @EventRecorder RETURN END ELSE BEGIN SET @ReturnValue = 1 EXEC sp_OADestroy @EventRecorder RETURN END END ELSE BEGIN SET @ReturnValue = 1 RETURN END ErrorHandle: SET @ReturnValue = 1 EXEC sp_OADestroy @EventRecorder RETURN
[SyBase]使用dbcc memusage确定procedure cache size大小 [SyBase]dbcc memusage确定Procedure Cache Size [MySql]MySQL5.0 Alpha & Create Procedure [Sql Server]My First PL/SQL Procedure [Sql Server]pager procedure for sql server
|