我需要跟踪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>
答案 0 :(得分:1)
首先,我强烈建议您将此表移动到[master]或[msdb]。具有依赖于任何非系统数据库的登录触发器是非常有问题的。
其次,如果当前的问题是“如何授予所有登录权限?”如您的评论中所述,答案是:“将它们授予公共服务器角色。”每次登录都在该角色中,因此其权限适用于所有人。
答案 1 :(得分:0)
在所有服务器上创建TRIGGER [Logon_Audit_Tgr] WITH EXECUTE AS'sa' 登录 如 开始....