要找出在 2000/2005 年连接到数据库服务器的进程的名称,您需要运行一个作业,可能每 30 秒或更频繁。该工作必须将结果存储到临时表中,然后添加新的进程名称和数据库,也许还有登录名。这是一个开始:
创建一个表来积累信息:
create table DBUsage_accumulate (
[id] int identity(1,1) NOT NULL,
[LoginName] SYSNAME NOT NULL,
HostName SYSNAME NOT NULL,
DBName SYSNAME NOT NULL,
CONSTRAINT PK_DBUSAGE_ACCUMULATE PRIMARY KEY CLUSTERED (id asc));
那你需要对这个表有唯一性约束,使用索引:
CREATE UNIQUE NONCLUSTERED INDEX
IX_ACCUMULATE_LOGIN_DB_HOST
on DBUsage_Accumulate
(
LoginName asc
,HostName asc
,DBName asc
);
现在您需要定期对 sp_who2 进行检查:
CREATE TABLE #temp_sp_who2
(
SPID INT,
Status VARCHAR(1000) NULL,
[LoginName] SYSNAME NULL,
HostName SYSNAME NULL,
BlkBy SYSNAME NULL,
DBName SYSNAME NULL,
Command VARCHAR(1000) NULL,
CPUTime INT NULL,
DiskIO INT NULL,
LastBatch VARCHAR(1000) NULL,
ProgramName VARCHAR(1000) NULL,
SPID2 INT
--,RequestID INT NULL --comment out for SQL 2000 databases
)
INSERT INTO #temp_sp_who2
EXEC sp_who2;
CREATE TABLE #temp_sp_who2
(
SPID INT,
Status VARCHAR(1000) NULL,
[LoginName] SYSNAME NULL,
HostName SYSNAME NULL,
BlkBy SYSNAME NULL,
DBName SYSNAME NULL,
Command VARCHAR(1000) NULL,
CPUTime INT NULL,
DiskIO INT NULL,
LastBatch VARCHAR(1000) NULL,
ProgramName VARCHAR(1000) NULL,
SPID2 INT
--,RequestID INT NULL --comment out for SQL 2000 databases
)
INSERT INTO #temp_sp_who2
EXEC sp_who2;
delete from #temp_sp_who2
where exists (
select 1 from DBUsage_accumulate A
where A.LoginName = #temp_sp_who2.Loginname
and A.HostName = #temp_sp_who2.hostName
and A.DBName = #temp_sp_who2.dbname);
insert into DBUsage_accumulate(LoginName,HostName,DBName)
select
distinct
LoginName
,HostName
,dbname
from #temp_sp_who2
where [DBName] is not null
and [HostName] != ' .';
将最后一段 SQL 放入每 5-30 秒运行一次的作业中,将累积所有主机名、数据库名和登录名的列表。您可以使用它来迁移正确的数据库和登录名以及修改客户端计算机中的连接字符串。
在 2000 年测试。