none
使用LOGON TRIGGER 监控 SQL Server 用户活动 RRS feed

  • 问题

  • 当SQL Server作为一些应用程序的后台数据库,有时候需知道一些用户活动的明细信息,比如哪些用户在什么时间段登录SQL Server。并且,通过这些信息,去控制用户登录的时间周期和限制同一个用户并发登录的最大数量。

    需要注意的是,LOGON TRIGGER只有当登录成功的时候才能被触发,此时用户的session 还没被有真正的建立。如果用户登录失败LOGON TRIGGER将不会被触发。

    2011年7月18日 5:11
    版主

答案

  • --创建LOGON TRIGGER,输出当前用户登录的信息
    CREATE TRIGGER OPS_LOGON1
    ON ALL SERVER
    AFTER LOGON
    AS
    BEGIN
    PRINT SUSER_SNAME() +' HAS JUST LOGGED IN TO '+UPPER(LTRIM(@@SERVERNAME))+' SQL SERVER AT '+LTRIM(GETDATE())
    END
    GO
    
    --创建LOGON TRIGGER,限定某个用户(REDMOND\SALEEM)的并发的登录次数(5次)
    CREATE TRIGGER OPS_LOGON2
    ON ALL SERVER WITH EXECUTE AS 'REDMOND\SALEEM'
    FOR LOGON
    AS
    BEGIN
    IF ORIGINAL_LOGIN()= 'REDMOND\SALEEM' AND
      (SELECT COUNT(*) FROM SYS.DM_EXEC_SESSIONS WHERE IS_USER_PROCESS = 1 AND ORIGINAL_LOGIN_NAME = 'REDMOND\SALEEM') > 5
      ROLLBACK;
    END;
    
    --创建LOGON TRIGGER,限定某个用户(REDMOND\SALEEM)在每天的某个时段不能登录
    CREATE TRIGGER OPS_LOGON3
    ON ALL SERVER WITH EXECUTE AS 'REDMOND\SALEEM'
    FOR LOGON
    AS
    BEGIN
     declare @EarlyTime datetime,
     @LateTime datetime,
     @todays_date varchar(25)
    
     set @todays_date = CONVERT(varCHAR(25),GETDATE(),110)
     set @EarlyTime = Convert(datetime, @todays_date + ' 07:00:00.000')
     set @LateTime = Convert(datetime, @todays_date + ' 23:00:00.000')
     if ORIGINAL_LOGIN()= 'REDMOND\SALEEM'
     and getdate() between @EarlyTime and @LateTime 
    ROLLBACK;
    END
    
    
    --查询 SERVER 级别的 TRIGGERS
    SELECT * FROM SYS.SERVER_TRIGGERS
    GO
    
    --删除TRIGGERS
    DROP TRIGGER OPS_LOGON1 ON ALL SERVER
    GO
    DROP TRIGGER OPS_LOGON2 ON ALL SERVER
    GO
    DROP TRIGGER OPS_LOGON3 ON ALL SERVER
    GO
    
    
    
    

    2011年7月18日 5:11
    版主