数据库级别DML操作监控审计、表触发器/对象触发器
更多参考:https://www.cnblogs.com/gered/p/10812399.html
使用触发器记录DML,使用触发器记录表的DML
数据库级别DML操作监控审计、表触发器/对象触发器
- --核心参考
- --SqlServer触发器 ,目的是记录操作内容
- begin
- declare @di table(et varchar(200), pt varchar(200), ei varchar(max))
- insert into @di exec('dbcc inputbuffer(@@spid)')
- declare @op varchar(10) select @op=case when exists(select 1 from inserted) and exists(select 1 from deleted)
- then 'Update'
- when exists(select 1 from inserted) and not exists(select 1 from deleted)
- then 'Insert'
- when not exists(select 1 from inserted) and exists(select 1 from deleted)
- then 'Delete'
- end
- if @op in('Update','Insert')
- begin
- insert into synchronization.dbo.synchro_log (operate,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
- select @op,@@spid,
- (select login_name from sys.dm_exec_sessions where session_id=@@spid),
- (select program_name from sys.dm_exec_sessions where session_id=@@spid),
- (select hostname from sys.sysprocesses where spid=@@spid),
- (select client_net_address from sys.dm_exec_connections where session_id=@@spid),
- (select top 1 isnull(ei,'') from @di), getdate()
- from inserted n
- end
- else
- begin
- insert into synchronization.dbo.synchro_log (operate,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
- select @op,@@spid,
- (select login_name from sys.dm_exec_sessions where session_id=@@spid),
- (select program_name from sys.dm_exec_sessions where session_id=@@spid),
- (select hostname from sys.sysprocesses where spid=@@spid),
- (select client_net_address from sys.dm_exec_connections where session_id=@@spid),
- (select top 1 isnull(ei,'') from @di),
- getdate()
- from deleted o
- end
- end
- --创建记录表
- CREATE TABLE T_SHALL_LOG (
- ID INT NOT NULL IDENTITY(1, 1)
- , EVTIME DATETIME NOT NULL DEFAULT(GETDATE())
- , --访问时间
- SQL VARCHAR(300)
- , --执行的SQL语句
- USERID VARCHAR(128) NOT NULL DEFAULT(SUSER_SNAME())
- , --连接的时候使用的哪个SQL登陆用户
- HOSTNAME VARCHAR(128) NOT NULL DEFAULT(HOST_NAME())
- , --客户端的机器吿
- LOGINID VARCHAR(128)
- , --客户端的登陆用户(OS的用户)
- APPNAME VARCHAR(128) NOT NULL DEFAULT(APP_NAME())
- , --是从查询分析器,还是应用程序来执行的
- OPTYPE INT
- , --执行的是INSERT,UPDATE,还是DELETE操作
- ROWCNT INT --影响了多少行数据
- )
- GO
- --创建测试表
- CREATE TABLE T_SHALL (
- A INT
- , B VARCHAR(10)
- )
- GO
- ---创建触发器
- CREATE TRIGGER TR_T_SHALL ON T_SHALL --需要监控的表名
- FOR INSERT
- , DELETE
- , UPDATE
- AS
- --ROWCNT
- DECLARE @ROWS INT
- SET @ROWS = @@ROWCOUNT
- SET NOCOUNT ON
- --SQL
- CREATE TABLE #T (
- EVENTTYPE VARCHAR(20)
- , PARAMETERS INT
- , EVENTINFO VARCHAR(300)
- ) ----用临时表保存exec('DBCC INPUTBUFFER...')的返回倿
- DECLARE @SPID VARCHAR(20)
- SET @SPID = CAST(@@SPID AS VARCHAR)
- INSERT #T
- EXEC ('DBCC INPUTBUFFER (' + @SPID + ')')
- --OPTYPE
- DECLARE @OPTYPE INT
- SET @OPTYPE = 2 --UPDATE
- IF NOT EXISTS (
- SELECT 1
- FROM INSERTED
- )
- SET @OPTYPE = 3 --DELETE
- IF NOT EXISTS (
- SELECT 1
- FROM DELETED
- )
- SET @OPTYPE = 1 --INSERT
- --进程信息
- DECLARE @USERID VARCHAR(128)
- , --连接的时候使用的哪个SQL登陆用户
- @HOSTNAME VARCHAR(128)
- , --客户端的机器吿
- @LOGINID VARCHAR(128)
- , --客户端的登陆用户(OS的用户)
- @APPNAME VARCHAR(128) --是从查询分析器,还是应用程序来执行的
- SELECT @USERID = LOGINAME
- , --连接的时候使用的哪个SQL登陆用户
- @HOSTNAME = HOSTNAME
- , --客户端的机器吿
- @LOGINID = NT_USERNAME
- , --客户端的登陆用户(OS的用户)
- @APPNAME = PROGRAM_NAME --是从查询分析器,还是应用程序来执行的
- FROM MASTER..SYSPROCESSES
- WHERE SPID = @@SPID
- --INSERT
- INSERT T_SHALL_LOG (
- SQL
- , USERID
- , HOSTNAME
- , LOGINID
- , APPNAME
- , OPTYPE
- , ROWCNT
- )
- SELECT EVENTINFO
- , @USERID
- , @HOSTNAME
- , @LOGINID
- , @APPNAME
- , @OPTYPE
- , @ROWS
- FROM #T
- GO
- ----DML操作测试
- SELECT *
- FROM t_shall_log;
- SELECT *
- FROM t_shall;
- INSERT t_shall
- VALUES (11, 'zhong' );
- INSERT t_shall
- VALUES (12 , 'shall')
- GO
- INSERT t_shall
- SELECT A + 2
- , B + ''
- FROM t_shall
- GO
- BEGIN TRANSACTION
- UPDATE t_shall
- SET A = 100 , B = ''
- WHERE A = 11
- COMMIT TRANSACTION
- GO
- DELETE t_shall WHERE A = 100
- GO
- SELECT * FROM t_shall_log;
- SELECT * FROM t_shall;
- INSERT dbo.T_SHALL
- VALUES (1000, 'sa')
- GO
- DELETE dbo.T_SHALL
- GO
- --核验
- select * from dbo.T_SHALL
- go
- select * from dbo.T_SHALL_LOG
- go
数据库级别DML操作监控审计、表触发器/对象触发器的更多相关文章
- 数据库级别DDL操作监控审计、数据库触发器/服务器触发器
关键词:数据库触发器/服务器触发器 ,数据库级别DDL操作监控审计,禁止修改登录名密码 [1]数据库级别DDL操作监控审计 转自2012示例库,只能数据库级别,不能实例级别 use database ...
- 怎样加快master数据库的写操作?分表原则!将表水平划分!或者添加写数据库的集群
1.怎样加快master数据库的写操作?分表原则!将表水平划分!减少表的锁定时间!!! 或者或者添加写数据库的集群!!!或者添加写数据库的集群!!! 2.既然分表了,就一定要注意分表的规则!要在代码层 ...
- Oracle 11G CRUD操作监控单个表
前言: 线上oracle数据库有张表的数据有些乱,依据应用db的log和应用的log也没有检查出来谁改动了.所以决定把这张单表做个具体的insert.update.delete监控.一:使用数据 ...
- SQL监控:mysql及mssql数据库SQL执行过程监控审计
转载 Seay_法师 最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好 ...
- Oracle触发器实现监控某表的CRUD操作
前提:请用sys用户dba权限登录 1.创建一个表来存储操作日志 create table trig_sql( LT DATE not null primary key, SID NUMBER, SE ...
- SQLServer 创建服务器和数据库级别审计
概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 一.常用的审核对象 1.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit L ...
- SQL Server 创建服务器和数据库级别审计
一.概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 二.常用的审核对象 2.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit ...
- SQL Server如何用触发器捕获DML操作的会话信息
需求背景 上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数 ...
- ORACLE中如何查找定位表最后DML操作的时间小结
在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析.总结一下. 1:使用ORA_ROWSCN伪列获取表最后的DML时间 ORA_ ...
随机推荐
- ELK+Filebeat+Kafka+ZooKeeper 构建海量日志分析平台
日志分析平台,架构图如下: 架构解读 : (整个架构从左到右,总共分为5层) 第一层.数据采集层 最左边的是业务服务器集群,上面安装了filebeat做日志采集,同时把采集的日志分别发送给两个logs ...
- Spark学习笔记——Spark Streaming
许多应用需要即时处理收到的数据,例如用来实时追踪页面访问统计的应用.训练机器学习模型的应用, 还有自动检测异常的应用.Spark Streaming 是 Spark 为这些应用而设计的模型.它允许用户 ...
- [转]搞个这样的 APP 要多久
我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要进来干一场,尽管王总从事的行当也算跟IT沾边,但毕竟太长时间不接触技术,有些东西不 ...
- PHP_CodeSniffer HG 服务端部署篇
环境:CentOs 6.7 语言:PHP5.4 PHP_CodeSniffer: https://github.com/phpdragon/PHP_CodeSniffer 本地代码检测请查看该文章:h ...
- 简单xmlrpc服务器
import calendar, SimpleXMLRPCServer class Calendar: def getMonth(self, year, month): return calendar ...
- day_10 py
整理代码!!2018-7-24 20:53:49 直接复制了东西: 一些的demo 重点看蓝字部分! 就是一些简单的方法 基础的而已! 2018-4-22 15:50:26 继续py 还是py好玩感觉 ...
- E - Train Problem I
As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want to ge ...
- B - 考试排名
C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错法,总是给你记上一笔,表明 ...
- ERP项目实施记录03
今天继续测试,3周了,终于弄到采购进货.
- robot framework教程-------虫师
http://www.testclass.net/2017/09/28/happy-holidays/