Sqlserver——日常维护——Login Trigger (登录触发器的使用)

简单的几种登录触发器的用法

1.限制登录时间 登录触发器


/*

1.限制登录触发器:
示例效果-->限制 登录名 TestUser 不能在每天的 10:00:00-12:00:00 登录数据库

*/

IF EXISTS ( SELECT * FROM sys.server_triggers WHERE name = N'Login_In_TimeSolt' )
BEGIN
    DROP TRIGGER Login_In_TimeSolt
    ON ALL SERVER ;
END ;
GO

CREATE TRIGGER Login_In_TimeSolt
ON ALL SERVER
FOR LOGON
AS
BEGIN
    IF (
           ORIGINAL_LOGIN() = 'TestUser' AND DATEPART(HOUR, GETDATE()) BETWEEN 10 AND 12
       )
    BEGIN
        PRINT N'用户TestUser在10~12点之间登录数据库,限制其登录' ;

        ROLLBACK ;
    END ;
END ;
GO

2.限制并发登录 登录触发器:

/*

2.限制并发登录触发器:
示例效果-->限制 登录名 TestUser 不能同时创建5个以上的数据库连接访问

*/
IF EXISTS (
              SELECT * FROM sys.server_triggers WHERE name = N'Login_restrict_concurrent_user_sessions'
          )
BEGIN
    DROP TRIGGER Login_restrict_concurrent_user_sessions
    ON ALL SERVER ;
END ;
GO

CREATE TRIGGER Login_restrict_concurrent_user_sessions
ON ALL SERVER
FOR LOGON
AS
BEGIN
    IF (
           SELECT COUNT(*)
           FROM   sys.dm_exec_sessions
           WHERE
                  is_user_process = 1 AND original_login_name = 'TestUser'
       ) > 5
    BEGIN
        PRINT N'用户TestUser会话数超过5个,限制其多余的访问的登录' ;

        ROLLBACK ;
    END ;
END ;
GO

3.设置登录主机名/ip地址白名单 登录触发器:

/*

3.设置登录主机名/ip地址白名单 登录触发器:
示例效果-->限制 只能通过本地机器登录数据库

*/

--创建白名单配置表

IF EXISTS ( SELECT * FROM sys.tables WHERE name = 'ValidIPAddressRange' )
BEGIN
    DROP TABLE ValidIPAddressRange ;
END ;

--默认加入本机地址
CREATE TABLE ValidIPAddressRange ( IP NVARCHAR (100)) ;

INSERT INTO dbo.ValidIPAddressRange ( IP )
VALUES
( N'' -- IP - nvarchar(100)
) ;

IF EXISTS ( SELECT * FROM sys.server_triggers WHERE name = N'Login_CheckIP' )
BEGIN
    DROP TRIGGER Login_CheckIP
    ON ALL SERVER ;
END ;
GO

CREATE TRIGGER Login_CheckIP
ON ALL SERVER
FOR LOGON
AS
BEGIN
    DECLARE @IP NVARCHAR (50) = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(50)') ;

    IF NOT EXISTS ( SELECT * FROM dbo.ValidIPAddressRange WHERE IP = @IP )
    BEGIN
        PRINT N'未加入白名单IP' + @IP + '登录数据库,限制其登录' ;

        ROLLBACK ;
    END ;
END ;
GO

4.记录登录信息 登录触发器

/*

4.记录登录信息登录触发器:
示例效果-->将每次成功登录数据库的信息写入到日志表当中

*/

--创建日志表

IF EXISTS ( SELECT * FROM sys.tables WHERE name = 'LoginAudit' )
BEGIN
    DROP TABLE LoginAudit ;
END ;

CREATE TABLE LoginAudit
(
    SPID       INT,          --登录ID
    LoginTime  DATETIME,     ---登录时间
    LoginName  VARCHAR (50), --登录名
    ClientHost VARCHAR (50), --客户端IP
    HostName   VARCHAR (50), --登录主机
    AppName    VARCHAR (500) --登录程序
) ;

IF EXISTS ( SELECT * FROM sys.server_triggers WHERE name = N'Login_Audit' )
BEGIN
    DROP TRIGGER Login_Audit
    ON ALL SERVER ;
END ;
GO

CREATE TRIGGER Login_Audit
ON ALL SERVER
WITH EXECUTE AS 'sa'---确保你的sa账户有效
FOR LOGON
AS
BEGIN
    DECLARE @LoginTime DATETIME,
            @LoginName VARCHAR (50),
            @ClientHost VARCHAR (50),
            @HostName VARCHAR (50),
            @AppName VARCHAR (500) ;

    SET @LoginTime = EVENTDATA().value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime') ;
    SET @LoginName = EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(50)') ;
    SET @ClientHost = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(50)') ;
    SET @HostName = HOST_NAME() ;
    SET @AppName = APP_NAME() ;

    INSERT INTO dbo.LoginAudit ( SPID, LoginTime, LoginName, ClientHost, HostName, AppName )
    VALUES
    ( @@SPID, @LoginTime, @LoginName, @ClientHost, @HostName, @AppName ) ;
END ;
GO

 

你可能感兴趣的:(数据库,SQL,server,登录触发器)