如何通过T-SQL获得当前连接的客户端的IP和机器名...
2006-05-06 13:53
543 查看
如何通过T-SQL获得当前连接的客户端的IP和机器名
/*****************************************************************************************************************
下面的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
(如需转载,请注明出处!)
*********************************************************************************************************/
Create proc usp_getClient_infor
as
set nocount on
Declare @rc int
Declare @RowCount int
Select @rc=0
Select @RowCount=0
begin
--//create temp table ,save sp_who information
create table #tspid(
spid int null,
ecid int null,
status nchar(60) null,
loginname nchar(256) null,
hostname nchar(256) null,
blk bit null,
dbname nchar(256) null,
cmd nchar(32)
)
--//create temp table save all SQL client IP and hostname and login time
Create table #userip(
[id]int identity(1,1),
txt varchar(1000),
)
--//Create result table to return recordset
Create table #result(
[id]int identity(1,1),
ClientIP varchar(1000),
hostname nchar(256),
login_time datetime default(getdate())
)
--//get host name by exec sp_who ,insert #tspid from sp_who,
insert into #tspid(spid,ecid,status,loginname,hostname,blk,dbname,cmd) exec sp_who
declare @cmdStr varchar(100),
@hostName nchar(256),
@userip varchar(20),
@sendstr varchar(100)
--//declare a cursor from table #tspid
declare tspid cursor
for select distinct hostname from #tspid with (nolock) where spid>50
for read only
open tspid
fetch next from tspid into @hostname
While @@FETCH_STATUS = 0
begin
select @cmdStr='ping '+rtrim(@hostName)
insert into #userip(txt) exec master..xp_cmdshell @cmdStr
select @rowcount=count(id) from #userIP
if @RowCount=2 --//no IP feedback package
begin
insert into #Result(ClientIP,hostname) values('Can not get feedback package from Ping!',@hostname)
end
if @RowCount>2
begin
select @userip=substring(txt,charindex('[',txt)+1,charindex(']',txt)-charindex('[',txt)-1)
from #userIP
where txt like 'Pinging%'
insert into #Result(ClientIP,hostname) values(@userIP,@hostname)
end
select @rc=@@error
if @rc=0
truncate table #userip --//clear #userIP table
fetch next from tspid into @hostname
end
close tspid
deallocate tspid
select * from #result with(nolock)
drop table #tspid
drop table #userip
drop table #result
end
go
exec usp_getClient_infor
/*****************************************************************************************************************
下面的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
(如需转载,请注明出处!)
*********************************************************************************************************/
Create proc usp_getClient_infor
as
set nocount on
Declare @rc int
Declare @RowCount int
Select @rc=0
Select @RowCount=0
begin
--//create temp table ,save sp_who information
create table #tspid(
spid int null,
ecid int null,
status nchar(60) null,
loginname nchar(256) null,
hostname nchar(256) null,
blk bit null,
dbname nchar(256) null,
cmd nchar(32)
)
--//create temp table save all SQL client IP and hostname and login time
Create table #userip(
[id]int identity(1,1),
txt varchar(1000),
)
--//Create result table to return recordset
Create table #result(
[id]int identity(1,1),
ClientIP varchar(1000),
hostname nchar(256),
login_time datetime default(getdate())
)
--//get host name by exec sp_who ,insert #tspid from sp_who,
insert into #tspid(spid,ecid,status,loginname,hostname,blk,dbname,cmd) exec sp_who
declare @cmdStr varchar(100),
@hostName nchar(256),
@userip varchar(20),
@sendstr varchar(100)
--//declare a cursor from table #tspid
declare tspid cursor
for select distinct hostname from #tspid with (nolock) where spid>50
for read only
open tspid
fetch next from tspid into @hostname
While @@FETCH_STATUS = 0
begin
select @cmdStr='ping '+rtrim(@hostName)
insert into #userip(txt) exec master..xp_cmdshell @cmdStr
select @rowcount=count(id) from #userIP
if @RowCount=2 --//no IP feedback package
begin
insert into #Result(ClientIP,hostname) values('Can not get feedback package from Ping!',@hostname)
end
if @RowCount>2
begin
select @userip=substring(txt,charindex('[',txt)+1,charindex(']',txt)-charindex('[',txt)-1)
from #userIP
where txt like 'Pinging%'
insert into #Result(ClientIP,hostname) values(@userIP,@hostname)
end
select @rc=@@error
if @rc=0
truncate table #userip --//clear #userIP table
fetch next from tspid into @hostname
end
close tspid
deallocate tspid
select * from #result with(nolock)
drop table #tspid
drop table #userip
drop table #result
end
go
exec usp_getClient_infor
相关文章推荐
- 如何通过T-SQL获得当前连接的客户端的IP和机器名...
- 如何通过T-SQL获得当前连接的客户端的IP和机器名
- SQL获得当前连接客户端IP和机器名
- 如何通过配置F5 使业务程序获得真实客户端IP 及 IIS 日志记录真实客户端的IP
- 通过新浪IP服务器获得的当前客户端IP地址对应的国家、省份或直辖市、城市信息
- 如何通过腾讯SOSO问问获得巨大IP流量?
- 如何获取Android手机连接当前网络的外网IP
- 如何通过.Net Compact Framework来获得应用程序的当前路径
- 如何能获得自己机器的外部IP呀
- 如何通过在 SQL Server 的早期版本使用客户端工具连接到的 SQL Server 2005 或 SQL Server 2000 命名实例
- com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1443 连接到主机 localhost 的 TCP/IP 连接失败。
- 关于socket通信的理解,socket连接通过IP+端口号的方式,那么如果两个服务器端的应用在同一台机器上,并且位于同一个tomcat容器下,那么岂不是两个服务器都收到了客户端发送的信息
- MSTR如何通过实体实现SQL中的连接查询
- 获得当前页面客户端的IP
- pl/sql 如何配置连接远程一个或多个数据库(1.同一个ip不同用户名,2.不同ip不同用户名)以及记住密码
- 数据表中有字段time(类型为varchar),如何通过sql语句找出这个字段里力离当前最近的一个日期
- 如何通过抓包查看客户端https连接中ssl/tls加密所采用的秘钥位数
- 如何获取Android手机连接网络的当前局域网IP
- 如何查看oracle某时刻的客户端连接情况并显示客户端IP
- 通过前端获取客户端ip和所在城市,并在后端获得这些值