接著前面提到過的如何寫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,
@[email protected],@[email protected],
@[email protected],@[email protected]
無參數有返回值:如
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,
@[email protected],@[email protected],
@[email protected],@[email protected]
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
新聞熱點
疑難解答