首页源码oracletrigger(Oracle数据库中的三种触发器技术)

oracletrigger(Oracle数据库中的三种触发器技术)

编程之家2024-02-11106次浏览

一、Oracle触发器的触发器类型.

1、语句级触发器语句级触发器在每个数据修改语句执行后只调用一次,而不管这一操作将影响到多少行。

oracletrigger(Oracle数据库中的三种触发器技术)

例1:创建一个orderdetails_tablelog表及一个AFTER触发器,用于记录是哪些用户删除了orderdetails表中的数据及删除的时间。

--先创建表

createtableorderdetails_tablelog

(

whovarchar2(40),

oper_datedate

oracletrigger(Oracle数据库中的三种触发器技术)

);

--再做触发器

createorreplacetriggerdele_orderdetails

afterdeleteonorderdetails

begin

insertintoorderdetails_tablelog(who,oper_date) values(user,sysdate);

oracletrigger(Oracle数据库中的三种触发器技术)

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的权限才行

三、Oracle中触发器有几种,用法与SQL Server一样吗谢谢

ORACLE触发器有以下两类:

1

语句级(Statement-level)触发器,在CREATE

TRIGGER语句中不包含FOR

EACH

ROW子句。语句级触发器对于触发事件只能触发一次,

而且不能访问受触发器影响的每一行的列值。一般用语句级触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行

2

行级(Row-level)触发器,在CREATE

TRIGGER语句中包含FOR

EACH

ROW子句。行级触发器可对受触发器影响的每一行触发,并且能

够访问原列值和通过SQL语句处理的新列值。行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。

SQL

Server支持两种类型的触发器:

AFTER

触发器和INSTEAD

OF

触发器。其中AFTER

类型触发器要求只有执行某一操作(INSERT

UPDATE

DELETE)

之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER

触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder

来完成此任务。

INSTEAD

OF

触发器表示并不执行其所定义的操作(INSERT、

UPDATE、

DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD

OF

触发器,也可以在视图上定义INSTEAD

OF

触发器,但对同一操作只能定义一个INSTEAD

OF

触发器。

cs地图(cs经典地图叫什么名?)架设邮件服务器(邮件服务器的架设方法与步骤详解)