您的位置:首页 > 数据库

如何通过T-SQL获得当前连接的客户端的IP和机器名

2008-04-27 16:01 666 查看
/*****************************************************************************************************************

下面的SP是返回所有的客户端IP和HOSTNAME,目的是可以通过JOB返回某一时间点的CLIENT的连接情况.

我当时写这个脚本的目的是经常有一些没有授权的客户机,通过SQLSERVER的CLIENT就连接到SQLSERVER,所以我可以定义一个JOB每隔30分钟运行一次这个存储过程,并且将内容写的一个LOG文件,这样可以大概记录有哪些CLIENT在连接SQLSERVER,当然大家可以可以修改这个脚本,使之返回更多的信息,比如CPU,MEMORY,LOCK....

Author:黄山光明顶

mail:leimin@jxfw.com

version:1.0.0

date:2004-1-30

(如需转载,请注明出处!)

*********************************************************************************************************/

Createprocusp_getClient_infor
as
setnocounton

Declare@rcint
Declare@RowCountint

Select@rc=0
Select@RowCount=0

begin
--//createtemptable,savesp_whoinformation
createtable#tspid(
spidintnull,
ecidintnull,
statusnchar(60)null,
loginnamenchar(256)null,
hostnamenchar(256)null,
blkbitnull,
dbnamenchar(256)null,
cmdnchar(32)
)

--//createtemptablesaveallSQLclientIPandhostnameandlogintime
Createtable#userIP(
[id]intidentity(1,1),
txtvarchar(1000),
)

--//Createresulttabletoreturnrecordset
Createtable#result(
[id]intidentity(1,1),
ClientIPvarchar(1000),
hostnamenchar(256),
login_timedatetimedefault(getdate())

)
--//gethostnamebyexecsp_who,insert#tspidfromsp_who,
insertinto#tspid(spid,ecid,status,loginname,hostname,blk,dbname,cmd)execsp_who

declare@cmdStrvarchar(100),
@hostNamenchar(256),
@userIPvarchar(20),
@sendstrvarchar(100)

--//declareacursorfromtable#tspid
declaretspidcursor
forselectdistincthostnamefrom#tspid with(nolock)wherespid>50
forreadonly

opentspid
fetchnextfromtspidinto@hostname
While@@FETCH_STATUS=0
begin
select@cmdStr='ping'+rtrim(@hostName)

insertinto#userIP(txt)execmaster..xp_cmdshell@cmdStr

select@rowcount=count(id)from#userIP

if@RowCount=2--//noIPfeedbackpackage
begin
insertinto#Result(ClientIP,hostname)values('CannotgetfeedbackpackagefromPing!',@hostname)
end
if@RowCount>2
begin
select@userIP=substring(txt,charindex('[',txt)+1,charindex(']',txt)-charindex('[',txt)-1)
from#userIP
wheretxtlike'Pinging%'

insertinto#Result(ClientIP,hostname)values(@userIP,@hostname)
end
select@rc=@@error
if@rc=0
truncatetable#userIP--//clear#userIPtable

fetchnextfromtspidinto@hostname
end

closetspid
deallocatetspid

select*from#resultwith(nolock)

droptable#tspid
droptable#userIP
droptable#result
end
go
execusp_getClient_infor
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐