触发器 trigger

触发器 关键字 trigger
什么事触发器   分类 
GUi 监听器  按钮添加一个监听
   当按钮被点击会触发一个事件
需要事件去触发
它跟存储过程以及函数的区别
    触发器在数据库中是以独立的对象存在
存储过程和函数需要用户调用laishiyong
而触发器是由一个事件触发,当满足这个事件会被自动调用(隐式调用)
触发器是没有参数的
而存储过程和函数可有可无


触发器分类
三种:
1、dml触发器 由dml语句触发(增删改)
语句级  行级
insteadof触发器(替代触发器)
根据视图 oracle 8 对视图操作
3、系统触发器 数据库开启和关闭

根据数据系统的事件进行触发

dml触发器  


语句级 当触发事件产生,满足触发条件
触发器只会执行一次


行级 当触发事件产生,受到该触发操作影响的每一行数据,触发器都会执行一次

语法结构
 create or replace trigger 触发器名
before|after
insert or update or delete
on 表名
(for each row 行级)
begin
if/when  触发条件 true
PLSQL 代码块
执行触发操作
end;


触发事件:引起触发器执行的事件
触发时间:before after  跟触发事件相对比执行的先后
触发对象: on 表 数据库 用户,触发器作用的对象 一旦当这个表删除时,该触发器也会销毁
触发操作:这个触发器要执行的操作
触发次数/频率:语句级 行级
触发条件:写在plsql代码块中,when if 子句
 返回true 时才会执行触发操作

dml  09:00-17:00周一至周五 
非工作时间 禁止对数据库表进行操作

系统触发器
数据库启动 关闭,用户执行ddl
语法格式
create or replace 触发器名
before/after
ddl_event_list/database_event_list
on database(数据库)/schema(用户)
begin
end;
常见的DDL操作事件
create drop alter ddl grant revoke
audit(审计) 
logon (登录数据库)
logoff (退出)
starup
shutdown
serverror(服务器错误)


系统触发器实例
记录用户登录和退出数据库信息
常用的属性函数
ora_login_user 显示当前数据库用户
ora_client_ip_address 显示ip
ora_sysevent返回事件名
ora_database_name 返回数据库名
ora_is_servererror 返回服务器端的错误


触发器可以让其失效
alter trigger 触发器名 disable 使触发器不可用
alter trigger 触发器名 enable 使触发器可用


使用触发器需要注意的点


1、同一个表上添加触发器,最多有12个触发器
   分别是不同类型,同一种类型触发器同一时间只允许有一个
   各个触发器之间不允许有矛盾
   before insert  语句
   before insert for each row行级 
   after insert  语句
   after insert for each row行级

   insert换成update/delete 共12种
2、一个触发器大小 32k
  当触发操作超出32k 先建立存储过程
  在触发器中用call 语句调用


3、触发操作涉及到sql语句,只允许使用dml语句
  ddl不行


4、触发器中不能包含 commit rollback 跟事务相关的语句
  触发器属于触发语句的一部分,当触发语句被提交或是回滚时,触发器也是会被提交回滚,但这是不允许的

--触发器
create or replace trigger t_emp
before insert or update or delete
on myemp1
begin
   dbms_output.put_line('当前表已发生修改');
end;

update myemp1 set sal=sal+100;
--在非工作时间 禁止对数据库表进行操作
--17:00-9:00 周六, 周日

create or replace trigger tri_emp


select to_char(sysdate,'DAY') from dual
select to_char(sysdate,'hh24:mi') from dual


to_char(sysdate,'DAY') in ('周六','周日');
to_char(sysdate,'hh24:mi') not between '17:00'and'09:00'

create or replace trigger myemp_time
before insert or update or delete
on myemp1

begin
   if(to_char(sysdate,'DAY') in ('周六','周日')) or (to_char(sysdate,'hh24:mi') not between '17:00'and'09:00') then
   --中断操作  抛出一个异常
   --raise_application_error(-20010,'提示语 --当前为非工作时间不能对表进行操作');
    raise_application_error(-20010,'提示语 :--当前为非工作时间不能对表进行操作');
    end if;
end;

update myemp1 set sal=sal+100;


--系统触发器
--记录用户登录和退出数据库信息
--新建表(以超级管理员去建)

create table logon_event(
       username varchar2(20),
       ipaddress varchar2(20),
       login_date date,
       logout_date date
)
select * from logon_event
--一个监测登陆
--ora_login_user 属性代表登陆的用户名
create or replace trigger t_logon
after logon
on database

begin
   insert into logon_event(username,ipaddress,login_date) values(ora_login_user,ora_client_ip_address,sysdate);

end; 

--检测退出的触发器
create or replace trigger t_logout
before logoff
on database
begin
   insert into logon_event(username,ipaddress,logout_date) values(ora_login_user,ora_client_ip_address,sysdate);

end;













  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值