数据库级别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_ ...
随机推荐
- [Python] 动态函数调用(通过函数名)
2018-04-09 update 利用python中的内置函数 eval() ,函数说明: def eval(*args, **kwargs): # real signature unknown & ...
- SQLServer最耗资源时间的SQL语句
作者kolachen http://blog.sina.com.cn/s/blog_63f3e0060102vcm0.html 先拷过来了,等有空再研究一下 执行最慢的SQL语句 SELECT (to ...
- Hook lua库函数时遇到的问题
最近在为distri.lua实现一个lua调试系统,有一个简单的需求,lua导入一个文件的时候,将这个文件的文件名记录下来, 以方便调试器在设置断点的时候判断是否一个合法的文件. lua导入文件是通过 ...
- vc写的dll被mingw的g++编译引用
dll.cpp,用vc2017编译 #include <iostream>#include <windows.h> extern "C" __declspe ...
- 关于linux-Centos 7下mysql 5.7.9的rpm包的安装方式
环境介绍>>>>>>>>>>>>>>>>>> 操作系统:Centos 7.1 mysql数据 ...
- mui---计算缓存大小及清除缓存
在做APP项目的时候,考虑到APP的的缓存文件太大,会考虑在APP内部设置清除缓存的功能. 具体方法: http://www.dcloud.io/docs/api/zh_cn/cache.html h ...
- 10.23 crm(3)
2018-10-23 20:34:30 继续增加新的功能!在代码注释里面有! 越努力,越幸运!永远不要高估自己! 还有明天再加上rbca权限管理系统就完美了! 然后crm做完,再过几天不挂针一切好了也 ...
- B - Broken Keyboard (a.k.a. Beiju Text) 数组模拟链表
You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem wi ...
- xml和json格式输出
<?php class Response{ const JSON ='json'; /* * 按综合方式输出通信数据 * @param integer $ ...
- Python把两个列表合成一个字典
简单粗暴上代码 A= [] B = [] C= dict(map(lambda x,y:[x,y],A,B)) 酱紫,就合成了一个字典