獲得客戶端詳細資訊以及每個程序的sql語句

2021-08-26 16:41:24 字數 1898 閱讀 7281

db效能下降時很多朋友都想監控到是哪個客戶端、哪個使用者、哪台客戶端發起的什麼會話sql語句,

但是微軟自帶的要使用profiler才能實現,但是考慮效能問題,很多人不願意!

網上有很多指令碼能監控到客戶端資訊,但是唯獨不能獲取客戶端程序的sql語句!

我自己寫了乙個,供參考:

--1.新建儲存過程

--create proc prtest

--@spid int

--as

--dbcc inputbuffer (@spid)

--go

--2.將結果儲存到臨時變數#tmp

--3.建立儲存結果的臨時表

create table #jttest(

[會話id] [smallint] not null,

[使用者名稱] [nvarchar](128) not null,

[資料庫] [nvarchar](128) not null,

[狀態] [nvarchar](60) not null,

[命令] [nvarchar](16) not null,

[應用軟體] [nvarchar](128) not null,

[等待時間] [bigint] not null,

[等待型別] [nvarchar](60) not null,

[客戶機名] [nvarchar](128) not null,

[ip位址] [varchar](48) not null,

[tsql] [varchar](4000) null

) --4.將#tmp中值匯入到臨時表變數#jttest

insert into #jttest

([會話id]

,[使用者名稱]

,[資料庫]

,[狀態]

,[命令]

,[應用軟體]

,[等待時間]

,[等待型別]

,[客戶機名]

,[ip位址]

)select

[會話id]

,[使用者名稱]

,[資料庫]

,[狀態]

,[命令]

,[應用軟體]

,[等待時間]

,[等待型別]

,[客戶機名]

,[ip位址]

from #tmp

--5.獲得每個spid對應的tsql語句

create table #tmp01(

eventtype nvarchar(100),

parameters int,

eventinfo nvarchar(max)

) declare @cursid int

declare cur cursor for select [會話id] from #jttest

open cur

fetch next from cur into @cursid

while @@fetch_status=0

begin

insert into #tmp01 exec prtest @cursid

update #jttest set tsql=(select eventinfo from #tmp01 )

where 會話id=@cursid

truncate table #tmp01

fetch next from cur into @cursid

endclose cur

deallocate cur

drop table #tmp01

--6.檢視最終結果

select * from #jttest

drop table #tmp

drop table #jttest

--dbcc inputbuffer (896)

新浪微博客戶端詳解(一)

裡面總共使用了三種授權認證方式,這裡面我只講解第三種授權認證方式,其他兩種方式可以自己研究一下。本人在使用auth2.0的授權認證過程中,重寫了該介面.中只顯示了兩個步驟,就是獲取code值和token兩個值。這個圖中詳細介紹了auth2.0認證的過程和各個值的獲取。現在我把效果圖展示如下 獲取co...

php獲得客戶端ip

在php 中使用 server remote addr 來取得客戶端的 ip 位址,但如果客戶端是使用 伺服器來訪問,那取到的就是 伺服器的 ip 位址,而不是真正的客戶端 ip 位址。要想透過 伺服器取得客戶端的真實 ip 位址,就要使用 server http x forwarded for 來...

關於獲得客戶端ip

在 asp 中使用 request.servervariables remote addr 來取得客戶端的 ip 位址,但如果客戶端是使用 服務 器來訪問,那取到的就是 伺服器的 ip 位址,而不是真正的客戶端 ip 位址。要想透過 伺服器取得客戶端的真實 ip 位址,就要使用 request.se...