触发器记录表某一个字段数据变化的日志 包括插入insert 修改update 删除delete 操作
2013-09-08 20:52
1101 查看
本文参考:http://www.cnblogs.com/lyhabc/articles/3236985.html
-- 建跟踪触发器
ALTER trigger tr_sto
on sto after update,insert,delete
as
begin
declare @di table(et NVARCHAR(max),pt NVARCHAR(max),ei NVARCHAR(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 ='Update'
--IF UPDATE(de) --关键字段发生表更记录。
--BEGIN
BEGIN
insert into log_sto
(operate,id,old_de,new_de,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
select @op,n.id,o.de,n.de,@@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
left join deleted o on o.id=n.id
WHERE ISNULL(o.de,'')<>ISNULL(n.de,'') --只记录修改字段old值和new值不一样的情况。
--WHERE CHECKSUM(o.de)<>CHECKSUM(n.de)
END
--end
ELSE if @op ='Insert'
begin
insert into log_sto
(operate,id,old_de,new_de,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
select @op,n.id,o.de,n.de,@@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
left join deleted o on o.id=n.id
end
else
begin
insert into log_sto
(operate,id,old_de,new_de,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
select @op,o.id,o.de,null,@@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
goView Code
-- 建跟踪触发器
ALTER trigger tr_sto
on sto after update,insert,delete
as
begin
declare @di table(et NVARCHAR(max),pt NVARCHAR(max),ei NVARCHAR(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 ='Update'
--IF UPDATE(de) --关键字段发生表更记录。
--BEGIN
BEGIN
insert into log_sto
(operate,id,old_de,new_de,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
select @op,n.id,o.de,n.de,@@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
left join deleted o on o.id=n.id
WHERE ISNULL(o.de,'')<>ISNULL(n.de,'') --只记录修改字段old值和new值不一样的情况。
--WHERE CHECKSUM(o.de)<>CHECKSUM(n.de)
END
--end
ELSE if @op ='Insert'
begin
insert into log_sto
(operate,id,old_de,new_de,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
select @op,n.id,o.de,n.de,@@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
left join deleted o on o.id=n.id
end
else
begin
insert into log_sto
(operate,id,old_de,new_de,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
select @op,o.id,o.de,null,@@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
goView Code
相关文章推荐
- MySQL--操作简记(create创建操纵表、insert插入、update更新、delete删除数据)
- 触发器记录表某一个字段数据变化的日志
- 表的三种基本操作:插入(insert)、删除(delete)、更新(update)
- (Insert)插入语句,(Update)修改语句,(delete)删除语句
- 1.利用android提高的的insert,query,update,deleteAPI与execSql,rawQuery函数执行原生的插入,查询,更新,删除语句操作花费时间的对比结果
- sqlserver/oracle当插入表数据时同时修改其中一个字段的触发器
- 数据库 误操作(更新数据(Update),删除数据(delete),当然也包括增加大量数据(insert))之后,给出的解决方案
- ArcGIS shape文件 要素类包括点,面,折线,多点,多面数据表字段以及数据的查看,添加,删除,修改四大操作
- Chapter 3. SQL Server数据库、表的基本操作(insert插入、update更新、delete、truncate删除语句)
- [转]MSSQL数据库触发器--更新(update),删除(delete),插入(insert)
- 一个操作共享内存的类!可以方面的添加,删除数据,包括各种结构体!
- elasticsearch Insert 插入数据和delete 删除数据(Java)
- SQL_4th_插入insert、查询select、删除delete、更新update
- 写的一个XML操作类,包括读取/插入/修改/删除。
- jsp操作MySQL实现查询、插入与删除功能(query、insert、delete)
- Ibatis 批量添加修改删除-batch-insert-update-delete
- 3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的差别,sql文件导入
- oracle 数据库表字段添加、修改、删除等DDL操作
- 订单号数据类型修改--删除和创建复制订阅项目(只需要操作指定字段作为主键的那些)
- Mysql EF 触发器生成主键id 存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项 ;System.Data.Entity.Infrastructure.DbUpdateConcurrencyException