更多参考: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操作监控审计、表触发器/对象触发器的更多相关文章

  1. 数据库级别DDL操作监控审计、数据库触发器/服务器触发器

    关键词:数据库触发器/服务器触发器  ,数据库级别DDL操作监控审计,禁止修改登录名密码 [1]数据库级别DDL操作监控审计 转自2012示例库,只能数据库级别,不能实例级别 use database ...

  2. 怎样加快master数据库的写操作?分表原则!将表水平划分!或者添加写数据库的集群

    1.怎样加快master数据库的写操作?分表原则!将表水平划分!减少表的锁定时间!!! 或者或者添加写数据库的集群!!!或者添加写数据库的集群!!! 2.既然分表了,就一定要注意分表的规则!要在代码层 ...

  3. Oracle 11G CRUD操作监控单个表

    前言:    线上oracle数据库有张表的数据有些乱,依据应用db的log和应用的log也没有检查出来谁改动了.所以决定把这张单表做个具体的insert.update.delete监控.一:使用数据 ...

  4. SQL监控:mysql及mssql数据库SQL执行过程监控审计

    转载 Seay_法师 最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好 ...

  5. Oracle触发器实现监控某表的CRUD操作

    前提:请用sys用户dba权限登录 1.创建一个表来存储操作日志 create table trig_sql( LT DATE not null primary key, SID NUMBER, SE ...

  6. SQLServer 创建服务器和数据库级别审计

    概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 一.常用的审核对象 1.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit L ...

  7. SQL Server 创建服务器和数据库级别审计

    一.概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 二.常用的审核对象 2.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit ...

  8. SQL Server如何用触发器捕获DML操作的会话信息

    需求背景 上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数 ...

  9. ORACLE中如何查找定位表最后DML操作的时间小结

    在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析.总结一下. 1:使用ORA_ROWSCN伪列获取表最后的DML时间 ORA_ ...

随机推荐

  1. Java 8 StampedLock解决同步问题

    Java 8新特性探究(十)StampedLock将是解决同步问题的新宠 JDK8中StampedLock原理探究 深入理解StampedLock及其实现原理 JDK1.8 StampedLock源码 ...

  2. java指纹识别+谷歌图片识别技术_源代码

    主类: import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; public c ...

  3. @ResponseBody的作用

    由于之前一直用struts2,对springMvc的注解并不太了解.新公司的项目用的是springMvc+hibernate,看到了@ResponseBody注解 @ResponseBody作用类似于 ...

  4. python中将图片从客户端(client)推到(POST)到服务器端(server)的方法

    从客户端推json到服务器端的工作可以用flask很容易做到,那么需要推送图片的话可以先将图片存到json中再进行操作. 服务器端 from flask import request, Flask i ...

  5. 4G通信模块在ARM平台下的应用

    4G模块是连接物与物的重要载体,是终端设备接入物联网的核心部件之一.随着4G的普及,许多新兴市场对4G通信模块的需求都在日益扩大,那么在ARM平台的嵌入式设备上如何快速的应用4G模块呢? 4G通信模块 ...

  6. sklearn数据预处理

    一.standardization 之所以标准化的原因是,如果数据集中的某个特征的取值不服从标准的正太分布,则性能就会变得很差 ①函数scale提供了快速和简单的方法在单个数组形式的数据集上来执行标准 ...

  7. exec vs sp_executesql

    1.exec  vs  sp_executesql 1.1 说到exec了解SQLServer的朋友第一反应应该是它用来执行存储过程,对的这是其一,另一个作用是执行一个动态批处理.总结下:a.执行一个 ...

  8. DOM元素查找

    一.DOM是document的缩写,他是操作html文档的方法 二.常用查找元素的方法 直接 1.document.getElementById('标签的id')   在html中标签的id是不允许重 ...

  9. 170829、mybatis使用oracle和mybatis中批量更新

    一.mybatis执行批量更新batch update 的方法(mysql数据库) 1.数据库连接必须配置:&allowMultiQueries=true(切记一定要加上这个属性,否则会有问题 ...

  10. span 英文数字保持一行,中文自动换行

    html 中 span 换行规则如下: span不换行默认只针对英文有效 如果想对中文设置有效需要添加样式 style="white-space:nowrap;" 默认的情况是这样 ...