×

oracle 触发器哪个字段触发

oracle 触发器哪个字段触发(Oracle触发器的触发器类型.)

admin admin 发表于2023-11-04 23:58:46 浏览47 评论0

抢沙发发表评论

本文目录

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把需要触发的字段写上,不触发的就别写了