1. 前言
SQL Server是广泛使用的关系型数据库管理系统。在一个大型数据库系统中,经常有多个用户在其中工作。因此,在某些情况下,需要对SQL Server用户进行深入查找。本文将介绍正确的查找SQL Server用户的方法。
2. 查找已连接用户
2.1 使用活动监视器
活动监视器是SQL Server Management Studio提供的一种默认工具,可以显示SQL Server实例使用的处理器、内存和I/O资源的信息。它还可以显示当前连接到SQL Server的所有用户信息。
SELECT
[s].[session_id],
[c].[client_net_address],
[c].[program_name],
[s].[status],
[s].[login_time]
FROM
[sys].[dm_exec_sessions] AS [s]
JOIN
[sys].[dm_exec_connections] AS [c]
ON
[s].[session_id] = [c].[session_id]
WHERE
[s].[is_user_process] = 1
AND [s].[status] = 'running';
以上查询语句将返回当前运行的所有用户的会话ID、客户端网络地址、程序名称、登录时间和状态。
2.2 使用系统视图
SQL Server还有一些系统视图可以查找已连接的用户信息。以下是一些常用的系统视图:
sys.dm_exec_sessions:提供当前所有数据库会话的信息,包括登录信息、会话ID等。
sys.dm_exec_connections:提供有关连接到SQL Server实例的每个连接的信息,包括SPID、客户端IP和端口等。
sys.sysprocesses:提供有关SQL Server实例中正在运行的进程的信息,包括SPID、进程ID、数据库ID等。
下面是一个查询连接到SQL Server的用户信息的示例。该示例将返回所有已连接的用户,以及每个用户的登录时间和最后活动时间:
SELECT
[s].[login_name],
[s].[last_request_start_time],
[s].[last_request_end_time]
FROM
[sys].[sysprocesses] AS [p]
JOIN
[sys].[dm_exec_sessions] AS [s]
ON
[p].[spid] = [s].[session_id]
WHERE
[p].[status] = 'runnable'
AND [s].[is_user_process] = 1;
3. 查找未连接用户
3.1 使用服务器端跟踪
服务器端跟踪是一种记录SQL Server实例上发生的事件的方法,例如连接、断开连接、执行SQL语句等。通过配置服务器端跟踪,可以捕获未连接到SQL Server的用户信息。
下面是一个服务器端跟踪的示例:
DECLARE
@trace_id INT,
@max_size BIGINT,
@file_name NVARCHAR(200);
SET @max_size = 50;
SET @file_name = N'C:\Temp\server_trace';
-- 创建跟踪
EXECUTE sp_trace_create
@trace_id OUTPUT,
2,
@file_name,
@max_size,
NULL;
-- 添加事件
EXECUTE sp_trace_setevent
@trace_id,
14,
1,
0;
-- 启动跟踪
EXECUTE sp_trace_setstatus
@trace_id,
1;
以上示例将创建一个最大大小为50MB的跟踪,跟踪包括所有用户的连接事件。跟踪文件将保存在C:\Temp目录中。
3.2 使用DML触发器
DML触发器是一种用于捕获表上的数据更改事件的特殊类型的触发器。使用DML触发器可以跟踪未连接到SQL Server的用户对特定表的更改。
以下是一个用于跟踪用户对Sales表的更改的DML触发器:
-- 创建触发器
CREATE TRIGGER Sales_Trigger
ON Sales
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SELECT
USER_NAME() AS UserName,
HOST_NAME() AS HostName,
EVENTDATA();
END;
以上触发器将在Sales表上的任何INSERT、UPDATE或DELETE操作发生时调用。它将返回触发操作的用户和主机名以及事件数据。
4. 结论
通过本文介绍的方法,可以深入了解SQL Server实例中连接和未连接的用户。这些方法可以帮助管理员更好地管理数据库系统。