oracletrigger?oracle中的trigger有几种啊
大家好,今天小编来为大家解答oracletrigger这个问题,oracle中的trigger有几种啊很多人还不知道,现在让我们一起来看看吧!
oracle中的trigger有几种啊
ORACLE数据库有四种触发器,分别是DML、Instead-of、DDL、DB触发器,一般的应用系统中都是用到DML、Instead-of触发器,DDL、DB两种触发器是DBA管理数据库用得比较多
四种触发器分别有不同的作用
一、DML触发器:当发出UPDATE、INSERT、DELETE命令就可以触发已定义好的DML触发器,是最简单和常用的一种触发器
语法:
create or replace trigger trigger_name
after|before insert|update|delete
on table_name
for each row
二、Instead-of触发器:当向一个由多个表联接成的视图作DML操作时,一般情况下是不允许的,这时候就可以用Instead-of触发器来解决这种问题(在触发器写代码分别对各表作相应DML操作),语法是这样的:
create or replace trigger trigger_name
instead of insert|update|delete
on view_name
for each row
三、DDL触发器:当发出CREATE、ALTER、DROP、TRUNCATE命令时会触发已定义好的DDL触发器,这种触发器可以用来监控某个用户或整个数据库的所有对象的结构变化
语法:
create or replace trigger trigger_name
before|after create|alter|drop|truncate
on schema|database
例:
--禁止用CREATE、ALTER、DROP、TRUNCATE命令操作APPS用户的对象
create or replace trigger apps_no_ddl
before create or alter or drop or truncate
on apps
begin
raise_application_error(-20001,'不允许用DDL操作APPS用户的对象');
end;
四、DB事件触发器:当STARTUP、SHUTDOWN、LOGON、LOGOFF数据库时就会触发DB事件触发器,这种触发器可以用来监控数据库什么时候关闭/打,或者用户的LOGON/LOGOFF数据库情况
语法:
create or replace trigger trigger_name
before|after startup|shutdown|logon|logoff
on database
例:
--记录数据库关闭的时间(shutdown类型要用关键字before,startup用after)
create or replace trigger db_shutdown
before shutdown
on database
begin
insert into test_tbl(log_event) values('db shutdown at'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
commit;
end;
--记录用户LOGON时间(logoff类型要用关键字before,logon用after)
create or replace trigger user_logon_db
after logon
on database
begin
insert into test_tbl(username,logon_time) values(user,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
commit;
end;
注意:要创建DDL和DB事件这两种触发器必须要有DBA的权限才行
Oracle trigger 怎么用
trigger就是触发器
触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。
举例:
下面的触发器在更新表auths之前触发,目的是不允许在周末修改表:
create triggerauth_secure before insert or update or delete//对整表更新前触发
on auths
begin
if(to_char(sysdate,'DY')='SUN'
RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');
end if;
end
Oracle触发器的触发器类型.
1、语句级触发器语句级触发器在每个数据修改语句执行后只调用一次,而不管这一操作将影响到多少行。
例1:创建一个orderdetails_tablelog表及一个AFTER触发器,用于记录是哪些用户删除了orderdetails表中的数据及删除的时间。
--先创建表
createtableorderdetails_tablelog
(
whovarchar2(40),
oper_datedate
);
--再做触发器
createorreplacetriggerdele_orderdetails
afterdeleteonorderdetails
begin
insertintoorderdetails_tablelog(who,oper_date) values(user,sysdate);
end;
注意:在该触发器被触发后,尽管一次删除多条记录,但是触发器只执行一次插入操作;
例2:创建一个 BEFORE触发器,使得在向 ORDERS表中插入记录之前对 ShippedDate字段进行检测,要求其值不允许为周六或周日,发货时间应在8-18点之间.否则将提示错误’发货时间应为工作时间’.
create or replace trigger secure_shippeddate
before insert on orders
for each row
begin
if
(to_char(:new.shippeddate,’dy’)in('星期六','星期日'))
or
(to_number(to_char(:new.shippeddate,’hh24’))not between 8 and 18)
then
raise_application_error(-20500,’发货时间应为工作时间’);
endif;
end;
2、多条件触发器
CREATEORREPLACETRIGGER…BEFOREinsertorupdateordeleteON…BEGINIFINSERTINGTHEN…ENDIF;IFDELETINGTHEN…ENDIF;IFUPDATINGTHEN…ENDIF;End;例3:创建一个多条件触发器,用于实现记录用户对产品表进行的操作类型,操作时间,用户名(创建一个prod_operate_log表记载信息,其中操作编号自动增长).1)创建prod_operate_log表CREATETABLEprod_operate_log(OperIDnumber,usernamevarchar2(200),Operate_datetimestamp,Operate_typevarchar2(10));2)创建序列logIDCREATESEQUENCElogIDSTARTWITH1INCREMENTBY1NOMAXVALUECACHE10;
3、级联触发器把一个数据库触发器的动作与另一个触发器联系起来,使之触发另一个触发器。
例4:创建3个表A、B、C,在表A上设置一个INSERT触发器,用于向表B添加一条记录,在表B上设置一个INSERT触发器,用于向表C添加一条记录,,在表C上设置一个INSERT触发器,用于对A表中的所有记录进行更新(+10)
创建A、B、C三张表CREATETABLEA(AIDnumber);CREATETABLEB(BIDnumber);CREATETABLEC(CIDnumber);创建触发器表--在表A上创建INSERT触发器CREATEORREPLACETRIGGERinsert_aAFTERinsertONABegininsertintobvalues(1);End;--在表B上创建INSERT触发器CREATEORREPLACETRIGGERinsert_bAFTERinsertONBBegininsertintocvalues(2);End;-在表C上创建INSERT触发器CREATEORREPLACETRIGGERinsert_cAFTERinsertONCBEGINUPDATEaSETaid=aid+10;End;--测试,向A表插入数据5INSERTINTOAVALUES(5);
4、行级触发器行级触发器是按触发语句所处理的行激发的,可以引用受到影响的行值。创建触发器时采用关键字FOREACHROW这种访问是通过两个相关的标识符实现的:old:用于存放未进行修改前的数据:new:用于存放进行修改后的数据例5:修改 orderdetails_tablelog表,增加两列 orderid,productid,并创建一个 after触发器,用于记录是哪些用户在什么时间删除了 orderdetails表中的哪些数据。--先增加两列alter table orderdetails_tablelog add orderid number;alter table orderdetails_tablelog add productid number;--再做触发器create or replace trigger dele_orderdetailsafter delete on orderdetailsfor each row begininsert into orderdetails_tablelog(who,oper_date,orderid,productid)values(user,sysdate,:old.orderid,:old.productid);end;
Oracle 中的触发器有几种
ORACLE数据库有四种触发器,分别是DML、Instead-of、DDL、DB触发器,一般的应用系统中都是用到DML、Instead-of触发器,DDL、DB两种触发器是DBA管理数据库用得比较多
四种触发器分别有不同的作用
一、DML触发器:当发出UPDATE、INSERT、DELETE命令就可以触发已定义好的DML触发器,是最简单和常用的一种触发器
语法:
create or replace trigger trigger_name
after|before insert|update|delete
on table_name
for each row
二、Instead-of触发器:当向一个由多个表联接成的视图作DML操作时,一般情况下是不允许的,这时候就可以用Instead-of触发器来解决这种问题(在触发器写代码分别对各表作相应DML操作),语法是这样的:
create or replace trigger trigger_name
instead of insert|update|delete
on view_name
for each row
三、DDL触发器:当发出CREATE、ALTER、DROP、TRUNCATE命令时会触发已定义好的DDL触发器,这种触发器可以用来监控某个用户或整个数据库的所有对象的结构变化
语法:
create or replace trigger trigger_name
before|after create|alter|drop|truncate
on schema|database
例:
--禁止用CREATE、ALTER、DROP、TRUNCATE命令操作APPS用户的对象
create or replace trigger apps_no_ddl
before create or alter or drop or truncate
on apps
begin
raise_application_error(-20001,'不允许用DDL操作APPS用户的对象');
end;
四、DB事件触发器:当STARTUP、SHUTDOWN、LOGON、LOGOFF数据库时就会触发DB事件触发器,这种触发器可以用来监控数据库什么时候关闭/打,或者用户的LOGON/LOGOFF数据库情况
语法:
create or replace trigger trigger_name
before|after startup|shutdown|logon|logoff
on database
例:
--记录数据库关闭的时间(shutdown类型要用关键字before,startup用after)
create or replace trigger db_shutdown
before shutdown
on database
begin
insert into test_tbl(log_event) values('db shutdown at'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
commit;
end;
--记录用户LOGON时间(logoff类型要用关键字before,logon用after)
create or replace trigger user_logon_db
after logon
on database
begin
insert into test_tbl(username,logon_time) values(user,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
commit;
end;
注意:要创建DDL和DB事件这两种触发器必须要有DBA的权限才行
文章分享到这里,希望我们关于oracletrigger的内容能够给您带来一些新的认识和思考。如果您还有其他问题,欢迎继续探索我们的网站或者与我们交流,我们将尽力为您提供满意的答案。