如何获得同一时刻有几个用户操作同一个数据库?

jilate 2003-11-22 11:16:11
如果我想控制一个数据库的使用人数,如何作?,在软件中实现
SQL+VB
...全文
51 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangqingyu 2003-12-02
  • 打赏
  • 举报
回复
up
zjcxc 元老 2003-11-22
  • 打赏
  • 举报
回复
得到客户端的IP地址,大力有更好的办法?
zjcxc 元老 2003-11-22
  • 打赏
  • 举报
回复
/*--获取连接SQL服务器的信息

所有连接本机的:操作的数据库名,计算机名,用户名,网卡物理地址,IP地址
--邹建 2003.11--*/

/*--调用示例
--显示所有本机的连接信息
exec p_getlinkinfo

--显示所有本机的连接信息,包含ip地址
exec p_getlinkinfo @includeip=1

--显示连接指定数据库的信息
exec p_getlinkinfo '客户资料'
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_getlinkinfo]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_getlinkinfo]
GO

create proc p_getlinkinfo
@dbname sysname=null, --要查询的数据库名,默认查询所有数据库的连接信息
@includeip bit=0 --是否显示IP地址,因为查询IP地址比较费时,所以增加此控制
as
declare @dbid int
set @dbid=db_id(@dbname)

create table #tb(id int identity(1,1),dbname sysname,hostname nchar(128),loginname nchar(128),net_address nchar(12),net_ip nvarchar(15))
insert into #tb(hostname,dbname,net_address,loginname)
select distinct hostname,db_name(dbid),net_address,loginame from master..sysprocesses
where hostname<>'' and (@dbid is null or dbid=@dbid)

if @includeip=0 goto lb_show --如果不显示IP地址,就直接显示

declare @id int,@sql varchar(500)
select @id=max(id) from #tb

create table #ip(id int,a varchar(8000))
while @id>0
begin
select @sql='ping '+hostname from #tb where id=@id
insert #ip(a) exec master..xp_cmdshell @sql
update #ip set id=@id where id is null
set @id=@id-1
end

update #tb set net_ip=left(a,patindex('%:%',a)-1)
from #tb a inner join (
select id,a=substring(a,patindex('Ping statistics for %:%',a)+20,20) from #ip
where a like 'Ping statistics for %:%') b on a.id=b.id

lb_show:
select id,数据库名=dbname,客户机名=hostname,用户名=loginname
,网卡物理地址=net_address,IP地址=net_ip from #tb

go
pengdali 2003-11-22
  • 打赏
  • 举报
回复
呵呵,要得到ip这么麻烦?一个一个ping?没有必要吧。
zjcxc 元老 2003-11-22
  • 打赏
  • 举报
回复
/*--
所有连接本机的:操作的数据库名,计算机名,用户名,网卡物理地址,IP地址
--*/

create table #tb(id int identity(1,1),dbname sysname,hostname nchar(128),loginname nchar(128),net_address nchar(12),net_ip nvarchar(15))
insert into #tb(hostname,dbname,net_address,loginname)
select distinct hostname,db_name(dbid),net_address,loginame from master..sysprocesses where hostname<>''

declare @id int,@sql varchar(500)
select @id=max(id) from #tb

create table #ip(id int,a varchar(8000))
while @id>0
begin
select @sql='ping '+hostname from #tb where id=@id
insert #ip(a) exec master..xp_cmdshell @sql
update #ip set id=@id where id is null
set @id=@id-1
end

update #tb set net_ip=left(a,patindex('%:%',a)-1)
from #tb a inner join (
select id,a=substring(a,patindex('Ping statistics for %:%',a)+20,20) from #ip
where a like 'Ping statistics for %:%') b on a.id=b.id

select id,数据库名=dbname,客户机名=hostname,用户名=loginname
,网卡物理地址=net_address,IP地址=net_ip from #tb

drop table #tb,#ip
zjcxc 元老 2003-11-22
  • 打赏
  • 举报
回复
/*--
所有连接本机的计算机名,IP地址,用户名,网卡物理地址
--*/

create table #tb(id int identity(1,1),hostname nchar(128),loginname nchar(128),net_address nchar(12),net_ip nvarchar(15))
insert into #tb(hostname,net_address,loginname)
select distinct hostname,net_address,loginame from master..sysprocesses where hostname<>''

declare @id int,@sql varchar(500)
select @id=max(id) from #tb

create table #ip(id int,a varchar(8000))
while @id>0
begin
select @sql='ping '+hostname from #tb where id=@id
insert #ip(a) exec master..xp_cmdshell @sql
update #ip set id=@id where id is null
set @id=@id-1
end

update #tb set net_ip=left(a,patindex('%:%',a)-1)
from #tb a inner join (
select id,a=substring(a,patindex('Ping statistics for %:%',a)+20,20) from #ip
where a like 'Ping statistics for %:%') b on a.id=b.id

select * from #tb

drop table #tb,#ip
txlicenhe 2003-11-22
  • 打赏
  • 举报
回复
Select * from master..sysprocesses

sp_who
zjcxc 元老 2003-11-22
  • 打赏
  • 举报
回复
大力的非常清楚了.
pengdali 2003-11-22
  • 打赏
  • 举报
回复
create table #tspid(
spid int null,
ecid int null,
status varchar(20) null,
loginname varchar(20) null,
hostname varchar(20) null,
blk bit null,
dbname varchar(20) null,
cmd varchar(20)
)

insert into #tspid(spid,ecid,status,loginname,hostname,blk,dbname,cmd) exec sp_who



select * from #tspid where dbname='你的库'
pengdali 2003-11-22
  • 打赏
  • 举报
回复
SP_LOCK --检测SQL SERVER当前资源LOCK的状态。
SP_MONITOR --显示当前的SESSION的状态。
SP_WHO2 --显示当前SQL SERVER和client的连接状态和CPU,I/O的状态。

. 列出特定用户的进程
此示例显示如何通过登录名查看有关单个当前用户的信息。

USE master
EXEC sp_who 'janetl'

C. 显示所有活动进程
USE master
EXEC sp_who 'active'

D. 通过进程 ID 显示特定进程
USE master
EXEC sp_who '10' --specifies the process_id
pengdali 2003-11-22
  • 打赏
  • 举报
回复
sp_who2

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧