1触发器
本质上:也是一个存储过程
1、存储过程可以带参数,触发器没有。
2、存储过程可以主动调用,触发器不能调用
分类1 DML触发器 insert
DDL触发器 create alter drop
系统触发器(启动、停止、登录、退出)
分类2 事前触发器 before 事后触发器after
分类3 行级触发器 语句级触发器
伪记录(幻表):new old 伪记录
insert 有new幻表 没有old幻表
update 有new幻表 有old幻表
delete 没有new幻表 有old幻表
before insert or update or delete
on busi_td_cart
for each row --行级触发器
declare
-- local variables here
begin
--dbms_output.put_line('触发器开始啦!');
--raise_application_error(-20001,'我会往外面抛一个异常');
if inserting then
--因为insert 操作而触发
update Cart_Count t set t.insert_c = t.insert_c+1;
dbms_output.put_line('新插入的记录有:'||:new.id);
elsif updating then
--因为update 操作而触发
update Cart_Count t set t.update_c = t.update_c+1;
dbms_output.put_line('老记录:'||:old.id||'新记录:'||:new.id);
elsif deleting then
--因为delete操作而触发
update Cart_Count t set t.delete_c = t.delete_c+1;
dbms_output.put_line('被删除的记录有:'||:old.id);
end if;
end;
2条件谓词:inserting updating deleting
注意:
触发器不允许重复监听
触发器的打断效果
/*
针对UserInfo表所有的触发器,
事前触发器
语句级触发器
*/
create or replace trigger UserInfo_B_IDU
before insert or update or delete
on busi_td_cart
for each row --行级触发器
declare
-- local variables here
begin
dbms_output.put_line('触发器开始啦!');
raise_application_error(-20001,'我会往外面抛一个异常');
end;
3 触发器的编译过程
编译 ——》编译成功——》执行事前触发器——》数据增删改——》执行事后触发器
raise_application_error(错误编号,错误信息);
错误编号:写负数,写2000以后
错误信息:写字符串
可以分开写触发器,监听三种不同的操作;
也可以写成一个触发器,通过判断不同的谓词来区分。
触发器和引发触发器执行的增删改行为 在同一个事务内 触发器内部不允许写commit或者rollback;
触发器不允许操作本表
4 什么时候没有幻表?
只有增删改的行级触发器 才有幻表
5 DDL触发器
create or replace trigger Global
after ddl
on LYJ.schema
declare
begin
--ora.sysevent() 记录操作
--ora_dict_obj_type() 记录类型
--org_dict_obj_name() 记录名字
--org_login_user() 记录登录的账号
dbms_output.put_line('执行的操作'||ora_sysevent());
dbms_output.put_line('记录类型'||ora_dict_obj_type());
dbms_output.put_line('记录名字'||ora_dict_obj_name());
dbms_output.put_line('记录登录的账号'||ora_login_user());
end Global;
create or replace trigger trg_dbs_01
--after startup 服务开启
--before shutdown 服务关闭
--after logon 登录成功
before logoff --退出登录
on database
declare
-- local variables here
begin
--用一张表的记录记录退出记录
null;
end ;
6 管理触发器
触发器状态:有效(启用 禁用) 无效
禁止: alter trriger 触发器名字 disable;
激活: alter trriger 触发器名字 enable;
全体禁止: alter table 表 disable all trrigers;
全体激活: alter table 表 enable all enable;
自动失效:修改触发器监听的表的结构
生效:重新编译触发器
1、手工操作:找到触发器 右键 Recompile
2、代码实现:alter trigger 名字 compile;
删除: drop trigger 名
大型软件系统 用得少 性能
级联触发器
最大32级级联效果 性能下降非常严重
性能表现:1索引
2显示游标 (相当于一个容器对象)
3触发器
本质上:也是一个存储过程
1、存储过程可以带参数,触发器没有。
2、存储过程可以主动调用,触发器不能调用
分类1 DML触发器 insert
DDL触发器 create alter drop
系统触发器(启动、停止、登录、退出)
分类2 事前触发器 before 事后触发器after
分类3 行级触发器 语句级触发器
伪记录(幻表):new old 伪记录
insert 有new幻表 没有old幻表
update 有new幻表 有old幻表
delete 没有new幻表 有old幻表
before insert or update or delete
on busi_td_cart
for each row --行级触发器
declare
-- local variables here
begin
--dbms_output.put_line('触发器开始啦!');
--raise_application_error(-20001,'我会往外面抛一个异常');
if inserting then
--因为insert 操作而触发
update Cart_Count t set t.insert_c = t.insert_c+1;
dbms_output.put_line('新插入的记录有:'||:new.id);
elsif updating then
--因为update 操作而触发
update Cart_Count t set t.update_c = t.update_c+1;
dbms_output.put_line('老记录:'||:old.id||'新记录:'||:new.id);
elsif deleting then
--因为delete操作而触发
update Cart_Count t set t.delete_c = t.delete_c+1;
dbms_output.put_line('被删除的记录有:'||:old.id);
end if;
end;
2条件谓词:inserting updating deleting
注意:
触发器不允许重复监听
触发器的打断效果
/*
针对UserInfo表所有的触发器,
事前触发器
语句级触发器
*/
create or replace trigger UserInfo_B_IDU
before insert or update or delete
on busi_td_cart
for each row --行级触发器
declare
-- local variables here
begin
dbms_output.put_line('触发器开始啦!');
raise_application_error(-20001,'我会往外面抛一个异常');
end;
3 触发器的编译过程
编译 ——》编译成功——》执行事前触发器——》数据增删改——》执行事后触发器
raise_application_error(错误编号,错误信息);
错误编号:写负数,写2000以后
错误信息:写字符串
可以分开写触发器,监听三种不同的操作;
也可以写成一个触发器,通过判断不同的谓词来区分。
触发器和引发触发器执行的增删改行为 在同一个事务内 触发器内部不允许写commit或者rollback;
触发器不允许操作本表
4 什么时候没有幻表?
只有增删改的行级触发器 才有幻表
5 DDL触发器
create or replace trigger Global
after ddl
on LYJ.schema
declare
begin
--ora.sysevent() 记录操作
--ora_dict_obj_type() 记录类型
--org_dict_obj_name() 记录名字
--org_login_user() 记录登录的账号
dbms_output.put_line('执行的操作'||ora_sysevent());
dbms_output.put_line('记录类型'||ora_dict_obj_type());
dbms_output.put_line('记录名字'||ora_dict_obj_name());
dbms_output.put_line('记录登录的账号'||ora_login_user());
end Global;
create or replace trigger trg_dbs_01
--after startup 服务开启
--before shutdown 服务关闭
--after logon 登录成功
before logoff --退出登录
on database
declare
-- local variables here
begin
--用一张表的记录记录退出记录
null;
end ;
6 管理触发器
触发器状态:有效(启用 禁用) 无效
禁止: alter trriger 触发器名字 disable;
激活: alter trriger 触发器名字 enable;
全体禁止: alter table 表 disable all trrigers;
全体激活: alter table 表 enable all enable;
自动失效:修改触发器监听的表的结构
生效:重新编译触发器
1、手工操作:找到触发器 右键 Recompile
2、代码实现:alter trigger 名字 compile;
删除: drop trigger 名
大型软件系统 用得少 性能
级联触发器
最大32级级联效果 性能下降非常严重
性能表现:1索引
2显示游标 (相当于一个容器对象)
3触发器