在sql server 2005上为登录触发器设置所有服务器的权限的位置

时间:2011-01-12 16:07:16

标签: sql-server sql-server-2005

我需要跟踪SQL Server 2005数据库中每个用户的上次登录时间。

我创建了一个这样的触发器:

CREATE TRIGGER LogonTimeStamp
ON ALL SERVER FOR LOGON
AS
BEGIN
  IF EXISTS (SELECT * FROM miscdb..user_last_login WHERE user_id = SYSTEM_USER)
    UPDATE miscdb..user_last_login SET last_login = GETDATE() WHERE user_id = SYSTEM_USER
  ELSE
    INSERT INTO miscdb..user_last_login (user_id,last_login) VALUES (SYSTEM_USER,GETDATE())
END;
go

此触发器适用于系统管理员但不允许常规用户登录的用户。我已经批准了公共选择,插入和更新表,但这似乎不是问题。有没有办法设置触发器的权限?还有其他我想念的东西吗?

普通用户收到错误消息:

Logon failed for login 'xxxx' due to trigger execution. 
Changed database context to 'xxxx', 
Changed language setting to us_english. (Microsoft SQL Server, Error: 17892).

由于

编辑:我们刚刚注意到这只发生在活动目录帐户上,而不是sql帐户。

例如:

C:\>osql -S server -E
Logon failed for login 'xxx\xxxx' due to trigger execution.

C:\>osql -S server -U xxxx
Password:
1>

2 个答案:

答案 0 :(得分:1)

首先,我强烈建议您将此表移动到[master]或[msdb]。具有依赖于任何非系统数据库的登录触发器是非常有问题的。

其次,如果当前的问题是“如何授予所有登录权限?”如您的评论中所述,答案是:“将它们授予公共服务器角色。”每次登录都在该角色中,因此其权限适用于所有人。

答案 1 :(得分:0)

在所有服务器上创建TRIGGER [Logon_Audit_Tgr]     WITH EXECUTE AS'sa'     登录 如     开始....