oracle触发器学习(一)

触发器定义大小最大为32KB,如果太大的话,可以通过调用函数和过程,支持12种方式

after、before{insert、update、delete(for each row)}, 不支持commit,rollback事务处理和ddl语句

when 中用new,old不带“:”,在begin end块中用:new :old,new和old代表新的一行和以前的一行

如需要某个字段的值用:new.column :old.column

启用和禁用触发器

alter trigger biu_emp_manager disable;
alter trigger biu_emp_manager enable;

 

/**********************************************
#通过触发器实现inserting,updating,deleting操作时
#比如在写日志加上操作类型
***********************************************/
create or replace trigger biud_employee
  before insert or update or delete on emp
declare
  v_type varchar2(100);
  v_name emp.ename%type = 'jack';
begin
  if inserting then
    v_type := 'insert';
  elsif updating then
    v_type := 'update';
  elsif deleting then
    v_insert := 'delete';
  end if;

  insert into log
    (date, name, type)
  values
    (to_char(sysdate, 'yyyymmdd'), v_name, v_type);
end;
/
/**********************************************
#通过触发器referecing为实现为old和new起别名
#isert只有new,delete只有old,update即有old也有new
***********************************************/
create or replace trigger biufr_emp
  before insert or update of sal on emp
  referencing old as old_value new as new_value
  for each row
  when new_value.sal < 800;
begin
  :new_value.comm := 0;
end;
/

/********************************************
# 通过触发器实现主键自增
********************************************/
create or replace trigger biur_emp_pk
  before insert on empty
  for each row
begin
  select seq_emp.nextval into :new.empid from dual;
end;

/********************************************
# 员工和其经理对应的一个视图
********************************************/
create or replace view v_emp_manager as
select b.empno,
       b.ename,
       b.job,
       b.hiredate,
       b.sal,
       b.mgr      mgr_no,
       a.ename    mgr_ename,
       a.job      mgr_job,
       a.hiredate mgr_hiredate,
       a.sal      mgr_sal
  from scott.emp a,
       (select empno, ename, job, mgr, hiredate, sal
          from scott.emp
         start with mgr is null
        connect by prior empno = mgr) b
 where a.empno = b.mgr;

/**********************************************
# 触发器,现在通过mgr_no更新mgr_ename
*********************************************/
create or replace trigger biu_emp_manager
  instead of update on v_emp_manager
begin
    update scott.emp
       set ename    = :new.mgr_ename,
           job      = :new.mgr_job,
           hiredate = :new.mgr_hiredate,
           sal      = :new.mgr_sal
     where empno = :old.mgr_no ;
end;

--触发器中:old.mgr_no会用上次的mgr_no的值去更新mgr字段,无法实现用empno直接更新mgr_ename和其它mgr字段
update v_emp_manager set mgr_ename=lower('JONES'), mgr_job=lower('ANALYST') where empno=7566;
--直接用mgr_no的值去更新mgr_ename和其它mgr字段
update v_emp_manager set mgr_ename=lower('KING') where mgr_no=7839;

/*****************************************
#类别:系统事件触发器
#内容:数据库启动、关闭、服务器错误等
#example:数据库启动
****************************************/
create or replace trigger ad_startup
  after startup on database
begin
  dbms_output.put_line('database started');
end;

/**********************************************************************
#类别:用户事件触发器
#内容:用户登录、注销
#craete/alter/drop/analyze/audit/grant/revoke/rename/truncate/logoff
#example:对schema进行drop操作后录日志
***********************************************************************/
create or replace trigger bdrop_emp_copy
  before drop on schema
begin
  insert into drop_objects
    (object_name, object_type, oper_time)
  values
    (ora_dict_obj_name, ora_dict_obj_type, sysdate);
end;

--创建记录日志表
create table drop_tables(
  object_name varchar2(100),
  object_type varchar2(100),
  oper_time date
); 

--定义一个object的type
create or replace type obj_emp as object 
(
  empno number(9),
  empname varchar2(32),
  hiredate date
);
--定义一个object的嵌套表
create type typ_emp is table of obj_emp;

drop type typ_emp;
drop type obj_emp;

create table emp_copy as select * from scott.emp;
drop table emp_copy;

select * from drop_objects

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值