停止trace的儲存過程

2021-04-02 14:34:43 字數 4320 閱讀 1140

停止trace的儲存過程

這個儲存過程和建立trace的儲存過程配合,可以非常靈活的控制trace的建立和停止。一般地,在作業中建立trace,可以設定trace執行的時間,到時間trace自動停止,不需要使用這個儲存過程停止。用這個儲存過程,是可以手動停止trace的執行。

use system

goif exists(select * from sysobjects where xtype='p' and name ='up_autotrace_stop')

drop procedure up_autotrace_stop

gocreate procedure up_autotrace_stop

@traceid int =0, --預設全部停止

@events varchar(512) = '' --要trace的事件,逗號為分隔符

as/**********

--檔名 :

--用途 :停止trace作業

--輸入引數 :

--返回值解釋 :

--建立者 : summer.yang

--建立日期 : 2005-6-18

--修改者 :

--修改日期 :

--修改註解 :(引用請保留此資訊)

--備註說明 :

**********/

set nocount on

--錯誤處理

declare @message nvarchar(4000)

declare @return int

set @return=0

set @message=''

---------------

--如果不存在開啟的trace,則直接結束

if not exists(select * from :: fn_trace_getinfo(0))

begin

set @message='there is no active trace in this server.'

goto finish

end-------------

declare @cursor cursor

--如果@traceid>0,則停止@traceid,

if @traceid>=1

begin

if exists (select * from :: fn_trace_getinfo(@traceid))

begin

exec sp_trace_setstatus @traceid, 0 --停止跟蹤

exec sp_trace_setstatus @traceid, 2 --關閉跟蹤

set @message= '儲存過程up_autotrace_stop: 成功停止乙個trace,此trace的id為:'+ltrim(str( @traceid))

endelse

begin

set @message= '儲存過程up_autotrace_stop: 無此traceid,輸入的traceid為:'+ltrim(str( @traceid))

set @return=-96

goto finish

endend

else if @traceid=0

begin --根據@events的值判斷

if len(@events)>0

begin--009

declare @tblevents table( eventid int not null )

declare @lenevents int,@estart int,@enext int

set @lenevents = len(@events)

select @estart = 1

select @enext = charindex(',',@events,@estart)

--輸入的trace的事件

while @enext > 0

begin

insert into @tblevents

select cast(substring(@events,@estart,@enext-@estart) as int)

--迴圈值增長

select @estart = @enext + 1

select @enext = charindex(',',@events,@estart)

if @enext = 0 set @enext = @lenevents + 1

if @estart > @lenevents set @enext = 0

end--刪除不正確的事件id

delete from @tblevents

where eventid<=9

or eventid>=119

or eventid in (29,31,32,48,49,56,57,62,63,64,65,66,99,101)

if not exists (select * from @tblevents)--不存在有效的事件

begin

set @message='儲存過程up_autotrace_stop: 輸入的事件型別無效!'+char(10)

+'輸入的事件型別是:'+@events

set @return=-98

goto finish

endend--009

set @cursor=cursor forward_only static for

select distinct traceid from :: fn_trace_getinfo(0)--已經存在的跟蹤

open @cursor

fetch next from @cursor into @traceid

while @@fetch_status=0

begin--008

if len(@events)>0

begin--如果@traceid=0,而@events有合法的事件,則查詢相應的@traceid停止

if not exists (

select * from @tblevents a

full outer join (select distinct eventid from ::fn_trace_geteventinfo(@traceid)

) bon a.eventid=b.eventid

where a.eventid is null

or b.eventid is null )

begin

exec sp_trace_setstatus @traceid, 0 --停止跟蹤

exec sp_trace_setstatus @traceid, 2 --關閉跟蹤

set @message= '儲存過程up_autotrace_stop: 成功停止乙個trace,此trace的事件列為:' +char(10)+@events

goto finish

endend

else--如果@traceid=0,而@events沒有合法的事件,則全部停止

begin

exec sp_trace_setstatus @traceid, 0 --停止跟蹤

exec sp_trace_setstatus @traceid, 2 --關閉跟蹤

print @message

set @message= '儲存過程up_autotrace_stop: 成功停止乙個trace,此trace的id為:'+ltrim(str( @traceid))

endfetch next from @cursor into @traceid

end--008

if len(@events)>0

begin

--沒有找到對應的事件列

set @message='儲存過程up_autotrace_stop: 沒有找到對應事件列的trace,未停止任何trace.'+char(10)

+'要查詢的事件列為:'+char(10)+@events

set @return=-97

goto finish

endend

-----------------

finish:

if @return<>0

begin

raiserror (@message,16,1 ) --with log

return @return

endelse

begin

print @message

--exec master.dbo.xp_logevent 70000,@message,informational

return @return

endgo

檢查trace的儲存過程

這個儲存過程用於檢查trace所在分割槽的空間大小,如果小於設定的值,則停止儲存到這個分割槽的trace if exists select from dbo.sysobjects where xtype p and name up autotrace check drop procedure up ...

批量刪除儲存過程的儲存過程

create procedure dropprocedure as declare cur cursor read only for select name from sysobjects where xtype p and name like drop declare name varchar 4...

儲存過程調儲存過程的事務

直接上 是在包裡寫的儲存過程,要測試的話,要先寫宣告 宣告procedure test1 p retcode in out varchar2,p retinfo in out varchar2 procedure test2 p retcode in out varchar2,p retinfo i...