登录触发器
登录触发器将为响应 LOGON 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。
可以使用登录触发器来审核和控制服务器会话,例如通过跟踪登录活动、限制 SQL Server 的登录名或限制特定登录名的会话数。例如,在以下代码中,如果登录名 login_test 已经创建了三个用户会话,登录触发器将拒绝由该登录名启动的 SQL Server 登录尝试。
USE master;
GO
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,
CHECK_EXPIRATION = ON;
GO
GRANT VIEW SERVER STATE TO login_test;
GO
CREATE TRIGGER connection_limit_trigger
ON ALL SERVER WITH EXECUTE AS 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test' AND
(SELECT COUNT(*) FROM sys.dm_exec_sessions
WHERE is_user_process = 1 AND
original_login_name = 'login_test') > 3
ROLLBACK;
END;
请注意,LOGON 事件对应于 AUDIT_LOGIN SQL Trace 事件,该事件可在事件通知中使用。触发器与事件通知的主要区别在于触发器随事件同步引发,而事件通知是异步的。也就是说,例如,如果要停止建立会话,则必须使用登录触发器。AUDIT_LOGIN 事件的事件通知不能用于此目的。
禁用登录触发器
登录触发器可以有效地阻止所有用户(包括 sysadmin 固定服务器角色的成员)与数据库引擎成功连接。在登录触发器正在阻止连接时,sysadmin 固定服务器角色的成员可通过使用专用管理员连接或者通过以最小配置模式 (-f) 启动数据库引擎来进行连接。有关详细信息,请参阅如何将 SQL Server Management Studio 与专用管理员连接配合使用和使用 SQL Server 服务启动选项。
捕获登录触发器事件数据
若要捕获有关 LOGON 事件的 XML 数据以在登录触发器内部使用,请使用 EVENTDATA 函数。有关详细信息,请参阅设计和实现结构化存储(数据库引擎)。LOGON 事件将返回以下事件数据架构:
<EVENT_INSTANCE>
<EventType>event_type</EventType>
<PostTime>post_time</PostTime>
<SPID>spid</SPID>
<ServerName>server_name</ServerName>
<LoginName>login_name</LoginName>
<LoginType>login_type</LoginType>
<SID>sid</SID>
<ClientHost>client_host</ClientHost>
<IsPooled>is_pooled</IsPooled>
</EVENT_INSTANCE>
<EventType>
包含 LOGON。<PostTime>
包含请求建立会话时的时间。<SID>
包含指定登录名的安全标识号 (SID) 的 Base 64 编码二进制流。<ClientHost>
包含建立连接的客户端的主机名。如果客户端和服务器名称相同,则此值为“<local_machine>”。否则,此值为客户端的 IP 地址。<IsPooled>
如果通过使用连接池重用连接,则此值为 1。否则,此值为 0。
创建、修改和删除登录触发器
登录触发器可从任何数据库创建,但在服务器级注册,并驻留在 master 数据库中。