更多参考: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. [Bayes] runif: Inversion Sampling

    runifum Inversion Sampling 看样子就是个路人甲. Ref: [Bayes] Hist & line: Reject Sampling and Importance S ...

  2. [Optimization] Greedy method

    Given two sequences of letters A and B, find if B is a subsequence of A in thesense that one can del ...

  3. 求大神帮解答calendar日期插件的问题

    小颖最近公司的项目里用了一款日期插件  calendar.js  但是在用的过程中遇到了难题,就是当日期只需要选择具体的月份就可以了,不需要再选具体日期时,小颖解决不了,只能让它默认显示出月份,但是月 ...

  4. java保存动态代理生成的类的class文件

    启动时加: -Dsun.misc.ProxyGenerator.saveGeneratedFiles=true

  5. android 中 webview 怎么用 localStorage? 我在 android里面 使用html5的 localStorage 为什么存不进去也读不出来呀? 网上搜了好多都没效果

    解决方案: mWebView.getSettings().setDomStorageEnabled(true); mWebView.getSettings().setAppCacheMaxSize(1 ...

  6. java编程感悟02

    很多时候我们需要网上查阅他人的代码,如果代码比较长或者注释较少,阅读起来就会比较费劲,这时需要培养快速读懂应用他人的代码的能力. 实现图片的旋转功能: import java.awt.geom.Aff ...

  7. 在PowerShell中使用Vim

    1.需要去Vim官网下载并安装一个可运行于Win8系统的执行文件(ftp://ftp.vim.org/pub/vim/pc/gvim74.exe). 2.设置PowerShell环境,使能“allow ...

  8. UDP协议的例子

    public class Service { // 服务器         public static void main(String[] args) {               Datagra ...

  9. 使用python爬虫爬取股票数据

    前言: 编写一个爬虫脚本,用于爬取东方财富网的上海股票代码,并通过爬取百度股票的单个股票数据,将所有上海股票数据爬取下来并保存到本地文件中 系统环境: 64位win10系统,64位python3.6, ...

  10. Vue----目录结构

    目录结构: (1):build:---------------------------------------------------------------------------------:保存 ...