db2 一个触发器 同时 insert delete_触发器

本文介绍了如何在SQL Server中使用触发器来跟踪表中数据的插入、更新和删除操作,以协助排查软件实施过程中的问题。通过创建触发器并在表上应用,可以记录每次操作的详细信息,包括操作类型、涉及的字段、更改前后的值、执行者信息等。
摘要由CSDN通过智能技术生成

1、

create trigger tr4_Tab_1

on 

Tab_1

for delete

as 

insert into Tab_2(NO) select No from deleted;

go

2、

# 启用、禁用触发器

--禁用触发器

disable trigger tgr_message on student;

--启用触发器

enable trigger tgr_message on student;

    # 查询创建的触发器信息

--查询已存在的触发器

select * from sys.triggers;

select * from sys.objects where type = 'TR';

--查看触发器触发事件

select te.* from sys.trigger_events te join sys.triggers t

on t.object_id = te.object_id

where t.parent_class = 0 and t.name = 'tgr_valid_data';

--查看创建触发器语句

exec sp_helptext 'tgr_message';

3、

在软件实施过程中,也许会有这样的问题: 表中数据出现非预期的结果,此时不确定是程序问题,哪个程序,存储过程,触发器.. 或还是人为修改的结果,此时可以用触发器对特定的表字段做跟踪监视,记录每次新增,修改,删除此字段值的操作详细信息(含登录名,主机名,IP地址,执行的TSQL语句,程序名等等), 以利于问题的排查.

本案例于测试环境: SQL Server 2008 R2中调试通过.

-- 建测试表

create table sto

(id int not null,    -- 主键字段

 de datetime         -- 被跟踪的字段

 constraint pk_sto primary key(id)

)

-- 建日志表

create table log_sto

(logid int not null identity(1,1),  -- 日志序号(日志主键)

 operate varchar(10),               -- 操作类型 如Insert,Update,Delete.

 id int,                            -- 原表ID(主键) 

 old_de datetime,                   -- de字段旧值

 new_de datetime,                   -- de字段新值

 spid int not null,                 -- spid

 login_name varchar(100),           -- 登录名

 prog_name varchar(100),            -- 程序名

 hostname varchar(100),             -- 主机名

 ipaddress varchar(100),            -- IP地址

 runsql varchar(4000),              -- 执行的TSQL代码

 UDate datetime                     -- 操作日期时间

 constraint pk_logsto primary key(logid)

)

-- 建跟踪触发器

create trigger tr_sto

on sto after update,insert,delete

as

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 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

go

--> 测试DML操作

-- 操作1

insert into sto(id,de) values(1,'2012-01-01 05:06:07')

go

-- 操作2

insert into sto(id,de) values(2,'2012-01-01 06:06:07')

go

-- 操作3

update sto set de=getdate() where id=2

go

-- 操作4

update sto set de=getdate() where id=1

go

-- 操作5

insert into sto(id,de) values(3,'2012-01-01 15:26:37')

go

-- 操作6

delete sto where id=2

go

c24e3f419fe1ac593ee88df99842361f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值