更多参考: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
 

最新文章

  1. CSS中清除浮动的两种方式
  2. 干货!表达式树解析"框架"(2)
  3. 百度地图-省市县联动加载地图 分类: Demo JavaScript 2015-04-26 13:08 530人阅读 评论(0) 收藏
  4. H2数据库攻略
  5. 42、lucene和机器学习进行全文搜索,并排序
  6. 002_kafka_相关术语详细解析
  7. 分享:mysql 随机查询数据
  8. XSD - <schema> 元素
  9. Android图片异步加载之Android-Universal-Image-Loader
  10. Maven实战七
  11. Qt 学习之路 :访问网络(4)
  12. .net 更改时间格式
  13. WriteTeacherObj
  14. GO语言初探
  15. HUSTOJ:Transit Tree Path
  16. python 集成cython 简单测试
  17. 关于用户输入恶意js
  18. hibernate框架学习之Session管理
  19. OnSen UI结合AngularJs打造”美团"APP首页 --Hybrid Ap
  20. 遇到执行SQL 的参数最大个数

热门文章

  1. 占位 Bootstrap
  2. 大杂烩 -- 四种生成和解析XML文档的方法详解
  3. 删除新版UniAccess Agent 办公室监控软件的方法
  4. Orleans学习总结(一)--入门认识
  5. 静态,关键字:static 接口,IUSB , API 接口关键字:interface
  6. db2 MON_GET_PKG_CACHE_STMT 表函数 抓取分析SQL
  7. db2 backup export
  8. js callback 和 js 混淆
  9. {前端CSS} 语法 Css的几种引入方式 css选择器 选择器的优先级 CSS属性相关 背景属性 边框 CSS盒子模型 清除浮动 overflow溢出属性  定位(position)z-index
  10. en-zh(科学技术)science and technology