sqlserver 登录记录(登录触发器)

本人自用 sqlserver  账号登录的记录(记录表+登录触发器)

--存储账号的登录记录信息
use [YWmonitor]
go
create table access_log
(
    [code] [int] IDENTITY(1,1) NOT NULL,
    [session_id] [int] NULL,
    [login_time] datetime NULL,
    [host_name] [varchar](50) NULL,
    [original_login_name] [varchar](50) NULL,
    [client_net_address] [varchar](50) NULL,
    CONSTRAINT [PK_access_log] PRIMARY KEY CLUSTERED
(
    [code] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

--登录触发器设置(确保sa用户可用)
use master
go
CREATE TRIGGER [tr_connection_limit]
ON ALL SERVER WITH EXECUTE AS ‘sa‘
FOR LOGON
AS
BEGIN
INSERT INTO [YWmonitor].[dbo].[access_log]
([session_id],[login_time],[host_name],[original_login_name],[client_net_address])
SELECT
a.[session_id],a.[login_time],a.[host_name],
a.[original_login_name],b.[client_net_address]
FROM MASTER.sys.dm_exec_sessions a
INNER JOIN MASTER.sys.dm_exec_connections b
ON a.session_id=b.session_id
END

 登陆触发器能为我们解决什么问题呢?本文将为你讲述5种运用登陆触发器的场景:

1) 限制某登录名(比如sa)只能在本机或者指定的IP中登陆;

2) 限制服务器角色(比如sysadmin)只能在本机或者指定的IP中登陆;

3) 限制某登录名(比如sa)只能某时间段内登陆;

4) 限制登录名与IP的对应关系,支持多对多关系;

5) 限制某登录名可以在某IP段登录

下面是借用 ’听风吹雨‘ 的几个常用的触发器设置:

CREATE LOGIN test WITH PASSWORD = ‘123‘
GO

-- =============================================
-- Author:        <听风吹雨>
-- Create date:    <2013.05.21>
-- Description:    <限制test用户只能在本机和指定的IP中登陆>
-- Blog:        <http://www.cnblogs.com/gaizai/>
-- =============================================
CREATE TRIGGER [tr_connection_limit]
ON ALL SERVER WITH EXECUTE AS ‘sa‘
FOR LOGON
AS
BEGIN

--限制test这个帐号的连接
IF ORIGINAL_LOGIN()= ‘test‘
--允许test在本机和下面的IP登录
AND
(SELECT EVENTDATA().value(‘(/EVENT_INSTANCE/ClientHost)[1]‘, ‘NVARCHAR(15)‘))
NOT IN(‘<local machine>‘,‘192.168.1.50‘,‘192.168.1.120‘)
     ROLLBACK;
END;
--插入测试数据
INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N‘nightworker‘, N‘192.168.1.*‘)

--创建登录触发器
-- =============================================
-- Author:        <听风吹雨>
-- Create date:    <2013.05.21>
-- Description:    <登陆名和IP过滤,支持IP范围规范>
-- Blog:        <http://www.cnblogs.com/gaizai/>
-- =============================================
CREATE TRIGGER [tr_logon_CheckLogOn_RangeIP]
ON ALL SERVER WITH EXECUTE AS ‘sa‘
FOR LOGON
AS
BEGIN
    DECLARE @LoginName sysname
    DECLARE @IP NVARCHAR(15)
    DECLARE @ValidIP NVARCHAR(15)
    DECLARE @len INT
    DECLARE @data XML
    DECLARE @blocked BIT;

    SET @len = 0
    SET @blocked = 0
    SET @LoginName = ORIGINAL_LOGIN();
    SET @data = EVENTDATA();
    SET @IP = @data.value(‘(/EVENT_INSTANCE/ClientHost)[1]‘, ‘NVARCHAR(15)‘);

    --判断登录名和IP
    IF NOT EXISTS(SELECT [ValidIP] FROM [Logon_DB].[dbo].[ValidLogOn] WHERE [LoginName] = @LoginName AND [ValidIP] = @IP)
    BEGIN
        --是否存在IP范围匹配
        SET @ValidIP = (SELECT TOP 1 [ValidIP] FROM [Logon_DB].[dbo].[ValidLogOn]
            WHERE [LoginName] = @LoginName AND [ValidIP] LIKE ‘%[*]‘);
        --如果存在就替换Client的IP
        IF (CHARINDEX(‘*‘,@ValidIP) > 0 AND @IP <> ‘<local machine>‘ AND @IP <> ‘127.0.0.1‘)
        BEGIN
            DECLARE @SubValidIP NVARCHAR(15)
            SET @SubValidIP = SUBSTRING(@ValidIP,0,CHARINDEX(‘*‘,@ValidIP))
            SET @len = LEN(@SubValidIP) + 1
            IF(SUBSTRING(@IP,0,@len) != @SubValidIP)
            BEGIN
                ROLLBACK;
                SET @blocked = 1
            END
        END
        ELSE
        BEGIN
            ROLLBACK;
            SET @blocked = 1
        END
    END

    --日志记录
    INSERT INTO [Logon_DB].[dbo].[LogonLog]
        ([session_id]
        ,[login_time]
        ,[host_name]
        ,[original_login_name]
        ,[client_net_address]
        ,[XmlEvent]
        ,[Blocked])
    SELECT
        @data.value(‘(/EVENT_INSTANCE/SPID)[1]‘, ‘smallint‘),
        GETDATE(),
        @data.value(‘(/EVENT_INSTANCE/ServerName)[1]‘, ‘sysname‘),
        @data.value(‘(/EVENT_INSTANCE/LoginName)[1]‘, ‘sysname‘),
        @data.value(‘(/EVENT_INSTANCE/ClientHost)[1]‘, ‘NVARCHAR(15)‘),
        @data,@blocked
END;

数据库操作记录触发器设计举例:

--创建表:VERSION_CONTROL_TABLE

CREATE TABLE [dbo].[VERSION_CONTROL_TABLE](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [databasename] [varchar](256) NULL,
    [eventtype] [varchar](50) NULL,
    [objectname] [varchar](256) NULL,
    [objecttype] [varchar](25) NULL,
    [sqlcommand] [nvarchar](max) NULL,
    [loginname] [varchar](256) NULL,
    [hostname] [varchar](256) NULL,
    [PostTime] [datetime] NULL,
    [Version] [int] NOT NULL,
 CONSTRAINT [PK_VERSION_CONTROL_TABLE] PRIMARY KEY CLUSTERED
(
    [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

  ---创建触发器:TRG_VERSION_CONTROL_TABLE

CREATE TRIGGER [TRG_VERSION_CONTROL_TABLE]
ON DATABASE
FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE,
CREATE_TABLE, ALTER_TABLE, DROP_TABLE,
CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION,
CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER,
CREATE_VIEW, ALTER_VIEW, DROP_VIEW,
CREATE_INDEX, ALTER_INDEX, DROP_INDEX

AS

SET NOCOUNT ON

DECLARE @CurrentVersion int
DECLARE @CurrentID int
DECLARE @DatabaseName varchar(256)
DECLARE @ObjectName varchar(256)
DECLARE @data XML

SET @data = EVENTDATA()
INSERT INTO dbo.VERSION_CONTROL_TABLE(databasename, eventtype,objectname, objecttype, sqlcommand, loginname,Hostname,PostTime, Version)
VALUES(
@data.value(‘(/EVENT_INSTANCE/DatabaseName)[1]‘, ‘varchar(256)‘),
@data.value(‘(/EVENT_INSTANCE/EventType)[1]‘, ‘varchar(50)‘),  -- value is case-sensitive
@data.value(‘(/EVENT_INSTANCE/ObjectName)[1]‘, ‘varchar(256)‘),
@data.value(‘(/EVENT_INSTANCE/ObjectType)[1]‘, ‘varchar(25)‘),
@data.value(‘(/EVENT_INSTANCE/TSQLCommand)[1]‘, ‘varchar(max)‘),
@data.value(‘(/EVENT_INSTANCE/LoginName)[1]‘, ‘varchar(256)‘),
HOST_NAME(),
GETDATE(),
0
)
SET @CurrentID = IDENT_CURRENT(‘VERSION_CONTROL_TABLE‘)
SELECT @DatabaseName = databasename, @ObjectName = objectname FROM VERSION_CONTROL_TABLE WHERE ID = @CurrentID
IF (@DatabaseName IS NOT NULL AND @ObjectName IS NOT NULL)
BEGIN
    SELECT @CurrentVersion = MAX(Version) FROM VERSION_CONTROL_TABLE WHERE databasename = @DatabaseName AND objectname = @ObjectName
    UPDATE VERSION_CONTROL_TABLE SET Version = ISNULL(@CurrentVersion, 0) + 1 WHERE ID = @CurrentID
END
时间: 2024-10-13 01:36:37

sqlserver 登录记录(登录触发器)的相关文章

登录触发器之控制IP与用户登录记录登录日志

USE [Logon_DB]GO /****** Object: Table [dbo].[LogonLog] Script Date: 2016/9/10 17:24:11 ******/SET ANSI_NULLS ONGO SET QUOTED_IDENTIFIER ONGO SET ANSI_PADDING ONGO CREATE TABLE [dbo].[LogonLog]( [Id] [int] IDENTITY(1,1) NOT NULL, [session_id] [smalli

通用权限管理系统记录登录日志中的一个问题

最近,在使用通用权限管理系统开发一个项目,数据库是MSSQL,登录时出现一个错误,发现是记录登录日志时出现的错误. 由于每次登录,都会记录登录日志,就是在记录日志时出现了错误. 先把错误截图 可以看出与记录登录日志的表BaseLoginLog的ID有关系,打开该表 发现该表的ID是nvarchar(50)类型,查询一下该表的数据,截图如下 可看到,ID实际存储的是GUID类型数据,然后我在调试底层代码,找到三个地方: 1 /// <summary> 2 /// 记录登录日志 3 /// <

清除Centos系统用户登录记录和命令记录

echo > /var/log/wtmp #清除用户登录记录和命令记录 echo > /var/log/btmp echo > /var/log/secure #如果没有这个文件,重启syslog进程service syslog restart echo > .bash_history history -c #清除命令记录

SQLServer IP不能登录问题解决

最近项目项目需要,要在windows2008R2服务器上部署项目,可是客户那边服务器上SqlServer也没有安装,一切都要自己解决,所以我就找了个2008的版本,进行安装,安装过程没有遇到什么问题,一切都很顺利,可是安装后,打开sql server management studio后,用Windows身份验证能通过,用sql server身份验证的时候,在服务器名称一栏中输入默认的 127.0.0.1,1433时怎么也无法登陆进去,但是输入<local>是可疑登录进去,,虽然local和1

Sqlserver中存储过程,触发器,自定义函数(一)

Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. 1.1存储过程的定义:存放在服务器上预先编译好的sql语句,可以给存储过程传递参数,也可以从存储过程返回值. 优点:提供了安全访问机制,比如可以将不同的存储过程的执行权限赋予权限不同的用户:改进了执行性能,因为存储过程是预编译的:减少了网络流量,因为在调用存储过程时,传递的字符串很短,没有很长的s

Sqlserver中存储过程,触发器,自定义函数

Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的存储过程,Insert,Update,Delete After触发器:记录被改变之后激活执行 Instead of触发器:记录被改变之前激活执行. DDL触发器:响应数据定义语言执行时触发执行的存储过程,一般用于执行数据库中的管理任务 审核和规范数据库的操作: 防止数据表结构被更改或删除 2. ht

使用SQLServer Audit来监控触发器的启用、禁用情况

原文:使用SQLServer Audit来监控触发器的启用.禁用情况 使用情景: 有时候会发现在触发器中的业务逻辑没有执行,可能是因为触发器的逻辑错误所引起的.但是有时候却是因为一些触发器被禁用了. 由于SQLServer默认不跟踪触发器的启用还是禁用.且禁用触发器的命令(Disable Trigger)不在默认跟踪里面捕获.但是可以在服务器级别的跟踪(不是使用Profiler)获取这些信息,捕获SQL:StmtCompleted并在TextData列筛选,但是对于负载较重的系统,这样会有比较大

Oracle EBS避免长时间不登录重新登录

 如何避免长时间不登录重新登录 (英文环境) 1.将配置文件ICX:Session Timeout的值设为空 2.将ICX:Limit time设置稍大些,如8小时 Profile说明: ICX:Session Timeout This profile option determines the length of time (in minutes) of inactivity in a user's session before the session is disabled. If th

bash的登录与登录成功显示信息对的修改

切换到命令输入模式下面Ctrl+Alt+F2~F7: 没有修改前的登录和登录成功显示的信息 1.修改配置文件: vim /etc/issue      (修改登录前界面的提示信息) 修改为: 修改之后登录界面的登录信息修改为: 2.修改登录系统之后界面提示信息: 上面第一张t图片里面有显示登录之后的提示信息 那么,我们来修改配置文件:vim /etc/motd  (修改成功后的提示信息) 修改之后的内容: 登录之后提示的信息: 3.当别人通过Telnet(远程链接)到我们系统时,别人界面显示的提