本文目录
- Oracle触发器的触发器类型.
- oracle 插入数据同时更新该数据某字段的触发器
- oracle触发器相关的问题
- Oracle触发器问题
- oracle 行级触发器 update某个字段触发
- Oracle 触发器 某行的字段更新时触发修改字段B,当空值被修改或者被修改为空值没有触发修改B
- Oracle触发器,求大神详细讲解
- 关于Oracle触发器的问题
- oracle触发器中需要通过字段来进行判断
- oracle触发器如何指定某个字段发生改变后触发
Oracle触发器的触发器类型.
1、语句级触发器 语句级触发器在每个数据修改语句执行后只调用一次,而不管这一操作将影响到多少行。例1:创建一个orderdetails_tablelog表及一个AFTER触发器,用于记录是哪些用户删除了orderdetails表中的数据及删除的时间。--先创建表createtableorderdetails_tablelog(whovarchar2(40),oper_datedate);--再做触发器createorreplacetriggerdele_orderdetailsafterdeleteonorderdetailsbegininsertintoorderdetails_tablelog (who,oper_date) values(user,sysdate);end;注意:在该触发器被触发后,尽管一次删除多条记录,但是触发器只执行一次插入操作;例2:创建一个 BEFORE 触发器,使得在向 ORDERS 表中插入记录之前对 ShippedDate字段进行检测, 要求其值不允许为周六或周日,发货时间应在8-18点之间.否则将提示错误’发货时间应为工作时间’.create or replace trigger secure_shippeddatebefore insert on ordersfor each rowbeginif(to_char(:new.shippeddate,’dy’)in(’星期六’,’星期日’))or(to_number(to_char(:new.shippeddate,’hh24’))not between 8 and 18)thenraise_application_error(-20500,’发货时间应为工作时间’);endif;end;2、多条件触发器CREATEORREPLACETRIGGER… BEFOREinsertorupdateordelete ON… BEGIN IFINSERTINGTHEN … 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)创建序列logID CREATESEQUENCElogID STARTWITH1 INCREMENTBY1 NOMAXVALUE CACHE10;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_a AFTERinsertONA Begin insertintobvalues(1); End; --在表B上创建INSERT触发器 CREATEORREPLACETRIGGERinsert_b AFTERinsertONB Begin insertintocvalues(2); End; -在表C上创建INSERT触发器 CREATEORREPLACETRIGGERinsert_c AFTERinsertONC BEGIN UPDATEa SETaid=aid+10; End; --测试,向A表插入数据5 INSERTINTOAVALUES(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_orderdetails after delete on orderdetails for each row begin insert into orderdetails_tablelog(who,oper_date,orderid,productid) values(user,sysdate,:old.orderid,:old.productid); end;
oracle 插入数据同时更新该数据某字段的触发器
A3表,字段t1,t2,t3A4表,字段t1,t2,t3以下触发器,功能是:在往A3表插入数据后触发,将刚刚插入的一行的数据插入表A4.create or replace trigger t1after insert on a3 for each rowbegin--将刚插入行的字段t1,t2,t3插入表A4中insert into a4 values(:new.t1,:new.t2,:new.t3);end;
oracle触发器相关的问题
trigger的触发条件是insert or update,他跟字段名无关,所以当你2个一起执行的时候,就会出现这样的情况:update 表534的时候,触发trigger:hjx_formtable534_inser533也跟着update;接着触发hjx_formtable533_update,这时又把534也update了。从此走上死循环的不归路。。。。。。其实可以这样(我不知道你哪个table1,哪个table2)。table1的trigger设置为affer,那么另外一个trigger设置为before,这样理论上应该可以同时触发2个 trigger而不会存在循环问题
Oracle触发器问题
你可以建一个行级的触发器, 它有两个属性 :New 和 :Old (很明显New就是跟新 后 或者插入时候的(行)值, Old就是删除或者跟新 前 的值 , 如果想要访问里面的某个字段就用 :New.empno就可以了)给你个范例--------------------------------------假设已经建好emp3 表,该表与emp2 表结构相同,多一个status 字段与act_time 字段,类型分别为varchar2(10) 和日期类型。写一个触发器,要求实现对emp2 表的审核。如:emp2 表插入数据时,emp3 同时插入该新数据 status 里写入 ’INSERT’ ; emp2 表 Delete 数据时,被删数据插入到emp3表中 ,status里写入 DELETE ; emp2表update 数据时,被更新数据写入emp3表中,且status 写入”UPDATE”。act_time 均写入当前时间。 CREATE OR REPLACE TRIGGER tri_emp2 AFTER UPDATE OR INSERT OR DELETE ON emp2 FOR EACH ROW BEGIN IF inserting THEN INSERT INTO emp3 VALUES(:New.empno,:New.ename, :New.job,:New.mgr,:New.hiredate,:New.sal, :New.comm,:NEW.deptno,’INSERT’,Sysdate); ELSIF deleting THEN UPDATE emp3 SET status=’DELETE’,ac_time=SYSDATE WHERE emp3.empno=:OLD.empno; ELSIF updating THEN UPDATE emp3 SET ename =:NEW.ename,job=:New.job,mgr=:New.mgr, hiredate=:New.hiredate,sal=:New.sal, comm =:New.comm,deptno =:NEW.deptno, status=’UPDATE’,ac_time=SYSDATE WHERE emp3.empno=:OLD.empno; END IF; END;
oracle 行级触发器 update某个字段触发
oracle 行级触发器 update某个字段触发create table test(id int,name varchar2(10),money int);insert into test values (1,’张三’,100);insert into test values (2,’李四’,29);insert into test values (3,’《a href=“https://www.baidu.com/s?wd=%E7%8E%8B%E4%BA%94&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3PWwbnycdnH61mHbznhn10ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3En1nLPWm4rHc3“ target=“_blank“ class=“baidu-highlight“》王五《/a》’,50);insert into test values (4,’赵六’,56);commit;
Oracle 触发器 某行的字段更新时触发修改字段B,当空值被修改或者被修改为空值没有触发修改B
create or replace trigger t_test after insert or update on 表名 for each row begin insert into 新表 (name,password) values (:NEW.name,:NEW.password); end t_test;
Oracle触发器,求大神详细讲解
1创建table1:CREATETABLEtable1(idnumber(5),namechar(20),agenumber(2),);2创建table2,并给count字段初值为0CREATETABLEtable2(countnumber(5),);INSERTINTOtable2VALUES(0);3插入触发器CREATEORREPLACETRIGGERadd_after_insertAFTERINSERTONtable1FOREACHROWDECLAREv_currentCountnumber(5);BEGINSELECTcountINTOv_currentCountFROMtable2;UPDATEtable2SETcount=v_currentCount+1;END4删除触发器CREATEORREPLACETRIGGERadd_after_deleteAFTERDELETEONtable1FOREACHROWDECLAREv_currentCountnumber(5);BEGINSELECTcountINTOv_currentCountFROMtable2;UPDATEtable2SETcount=v_currentCount+1;END5更新触发器CREATEORREPLACETRIGGERadd_after_updateAFTERUPDATEONtable1FOREACHROWDECLAREv_currentCountnumber(5);BEGINSELECTcountINTOv_currentCountFROMtable2;UPDATEtable2SETcount=v_currentCount+1;END
关于Oracle触发器的问题
trigger的触发条件是insert or update,他跟字段名无关,所以当你2个一起执行的时候,就会出现这样的情况:update 表534的时候,触发trigger:hjx_formtable534_inser533也跟着update;接着触发hjx_formtable533_update,这时又把534也update了。从此走上死循环的不归路。。。。。。其实可以这样(我不知道你哪个table1,哪个table2)。table1的trigger设置为affer,那么另外一个trigger设置为before,这样理论上应该可以同时触发2个 trigger而不会存在循环问题,我才下班,还没来得及试验,不好意思
oracle触发器中需要通过字段来进行判断
插入A之前的触发示例:create or replace trigger “TRIG_TEST_A“ before insert on “A“ for each rowbegin if inserting then if :NEW.“BM“ = ’C’ then --如果插入的A记录,BM字段等于C,则写入A_BAK insert into A_BAK (BM, TEACHERS, ID) values (:NEW.“BM“, :NEW.“TEACHERS“, :NEW.“ID“); end if; end if; end;
具体需求,根据触发器的语法进行调整
oracle触发器如何指定某个字段发生改变后触发
触发器的语法createupdate后面可以跟ofcolumn,column.....ontablename把需要触发的字段写上,不触发的就别写了