2024年10月oracle触发器性能(关于oracle触发器实现两个表按条件同步数据,大家帮帮忙)

 更新时间:2024-10-12

  ⑴oracle触发器性能(关于oracle触发器实现两个表按条件同步数据,大家帮帮忙

  ⑵关于oracle触发器实现两个表按条件同步数据,大家帮帮忙

  ⑶比较常见的trigger错误,你这一句话因为有触发器所以要对同一个表改两次,最好不要用trigger了,直接把处理写到程序里面更好,更容易控制,不容易产生不可预知的后果,或者性能问题。具体语句的话,可以考虑使用pragmaautonomous_transaction,但是不建议。

  ⑷mysql+版本的存储过程、触发器相比sqlserver和oracle性能差别大吗

  ⑸其实都差不多最主要还在SQL优化方面,搜索引擎数据量大的时候oracle要比mysql牛点,sqlserver垫底

  ⑹oracle中触发器都有几种

  ⑺oracle中触发器有三种.DML触发器ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。.替代触发器由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE专门为进行视图操作的一种处理方法。.系统触发器ORACLEi提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。

  ⑻oracle中的trigger有几种啊

  ⑼ORACLE数据库有四种触发器,分别是DML、Instead-of、DDL、DB触发器,一般的应用系统中都是用到DML、Instead-of触发器,DDL、DB两种触发器是DBA管理数据库用得比较多四种触发器分别有不同的作用一、DML触发器:当发出UPDATE、INSERT、DELETE命令就可以触发已定义好的DML触发器,是最简单和常用的一种触发器语法:createorreplacetriggertrigger_nameafter|beforeinsert|update|deleteontable_nameforeachrow二、Instead-of触发器:当向一个由多个表联接成的视图作DML操作时,一般情况下是不允许的,这时候就可以用Instead-of触发器来解决这种问题(在触发器写代码分别对各表作相应DML操作,语法是这样的:createorreplacetriggertrigger_nameinsteadofinsert|update|deleteonview_nameforeachrow三、DDL触发器:当发出CREATE、ALTER、DROP、TRUNCATE命令时会触发已定义好的DDL触发器,这种触发器可以用来监控某个用户或整个数据库的所有对象的结构变化语法:createorreplacetriggertrigger_namebefore|aftercreate|alter|drop|truncateonschema|database例:--禁止用CREATE、ALTER、DROP、TRUNCATE命令操作APPS用户的对象createorreplacetriggerapps_no_ddlbeforecreateoralterordroportruncateonappsbeginraise_application_error(-,’不允许用DDL操作APPS用户的对象’);end;四、DB事件触发器:当STARTUP、SHUTDOWN、LOGON、LOGOFF数据库时就会触发DB事件触发器,这种触发器可以用来监控数据库什么时候关闭/打,或者用户的LOGON/LOGOFF数据库情况语法:createorreplacetriggertrigger_namebefore|afterstartup|shutdown|logon|logoffondatabase例:--记录数据库关闭的时间(shutdown类型要用关键字before,startup用aftercreateorreplacetriggerdb_shutdownbeforeshutdownondatabasebegininsertintotest_tbl(log_event)values(’dbshutdownat’||to_char(sysdate,’yyyy-mm-ddhh:mi:ss’));mit;end;--记录用户LOGON时间(logoff类型要用关键字before,logon用aftercreateorreplacetriggeruser_logon_dbafterlogonondatabasebegininsertintotest_tbl(username,logon_time)values(user,to_char(sysdate,’yyyy-mm-ddhh:mi:ss’));mit;end;注意:要创建DDL和DB事件这两种触发器必须要有DBA的权限才行

  ⑽Oracle中触发器有几种,用法与SQLServer一样吗谢谢

  ⑾ORACLE触发器有以下两类:语句级(Statement-level触发器,在CREATETRIGGER语句中不包含FOREACHROW子句。语句级触发器对于触发事件只能触发一次,而且不能访问受触发器影响的每一行的列值。一般用语句级触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行行级(Row-level触发器,在CREATETRIGGER语句中包含FOREACHROW子句。行级触发器可对受触发器影响的每一行触发,并且能够访问原列值和通过SQL语句处理的新列值。行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。SQLServer支持两种类型的触发器:AFTER触发器和INSTEADOF触发器。其中AFTER类型触发器要求只有执行某一操作(INSERTUPDATEDELETE之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder来完成此任务。INSTEADOF触发器表示并不执行其所定义的操作(INSERT、UPDATE、DELETE,而仅是执行触发器本身。既可在表上定义INSTEADOF触发器,也可以在视图上定义INSTEADOF触发器,但对同一操作只能定义一个INSTEADOF触发器。

  ⑿oracle中触发器有什么作用

  ⒀。触发器的定义就是说某个条件成立的时候,你触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。然后,触发器的触发条件其实在你定义的时候就已经设定好的了。这里面需要说明一下,触发器可以分为语句级触发器和行级触发器。详细的介绍可以参考网上的资料,简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发。而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次。具体举例:.在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程。这个就是删除表的操作就是触发器执行的条件了。.在一个表吕定义了行级的触发器,那当这个表中一行数据发生变化的时候,比如删除了一行记录,那触发器也会被自动执行了。不知这样讲述可否清楚了呢?

  ⒁oracle数据库,触发器有什么用途,请用实例说明一下

  ⒂功能:、允许/限制对表的修改、自动生成派生列,比如自增字段、强制数据一致性、提供审计和日志记录、防止无效的事务处理、启用复杂的业务逻辑开始createtriggerbiufer_employees_department_idbeforeinsertorupdateofdepartment_idonemployeesreferencingoldasold_valuenewasnew_valueforeachrowwhen(new_value.department_id《》)begin:new_value.mission_pct:=;end;/触发器的组成部分:、触发器名称、触发语句、触发器限制、触发操作、触发器名称createtriggerbiufer_employees_department_id命名习惯:biufer(beforeinsertupdateforeachrowemployees表名department_id列名、触发语句比如:表或视图上的DML语句DDL语句数据库关闭或启动,startupshutdown等等beforeinsertorupdateofdepartment_idonemployeesreferencingoldasold_valuenewasnew_valueforeachrow说明:、无论是否规定了department_id,对employees表进行insert的时候、对employees表的department_id列进行update的时候、触发器限制when(new_value.department_id《》)限制不是必须的。此例表示如果列department_id不等于的时候,触发器就会执行。其中的new_value是代表跟新之后的值。、触发操作是触发器的主体begin:new_value.mission_pct:=;end;主体很简单,就是将更新后的mission_pct列置为触发:insertintoemployees(employee_id,last_name,first_name,hire_date,job_id,email,department_id,salary,mission_pct)values(,’Chen’,’Donny’,sysdate,,‘’,,,.);selectmission_pctfromemployeeswhereemployee_id=;触发器不会通知用户,便改变了用户的输入值。触发器类型:、语句触发器、行触发器、INSTEADOF触发器、系统条件触发器、用户事件触发器、语句触发器是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。例子:需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。Createtablefoo(anumber);Createtriggerbiud_fooBeforeinsertorupdateordeleteOnfooBeginIfusernotin(‘DONNY’)thenRaise_application_error(-,‘Youdon’thaveaesstomodifythistable.’);Endif;End;/即使SYS,SYSTEM用户也不能修改foo表对修改表的时间、人物进行日志记录。、建立试验表createtableemployees_copyasselect*fromhr.employees、建立日志表createtableemployees_log(whovarchar(),whendate);、在employees_copy表上建立语句触发器,在触发器中填充employees_log表。Createorreplacetriggerbiud_employee_copyBeforeinsertorupdateordeleteOnemployees_copyBeginInsertintoemployees_log(Who,when)Values(user,sysdate);End;/、测试updateemployees_copysetsalary=salary*.;select*fromemployess_log;、确定是哪个语句起作用?即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?可以在触发器中使用INSERTING/UPDATING/DELETING条件谓词,作判断:beginifinsertingthen-----elsifupdatingthen-----elsifdeletingthen------endif;end;ifupdating(‘COL’)orupdating(‘COL’)then------endif;、修改日志表altertableemployees_logadd(actionvarchar());、修改触发器,以便记录语句类型。Createorreplacetriggerbiud_employee_copyBeforeinsertorupdateordeleteOnemployees_copyDeclareL_actionemployees_log.action%type;Beginifinsertingthenl_action:=’Insert’;elsifupdatingthenl_action:=’Update’;elsifdeletingthenl_action:=’Delete’;elseraise_application_error(-,’Youshouldneverevergetthiserror.’);Insertintoemployees_log(Who,action,when)Values(user,l_action,sysdate);End;/、测试insertintoemployees_copy(employee_id,last_name,email,hire_date,job_id)values(,’Chen’,’Donnyhotmail’,sysdate,);select*fromemployees_logupdateemployees_copysetsalary=whereemployee_id=;、行触发器是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外:、定义语句中包含FOREACHROW子句、在BEFORE……FOREACHROW触发器中,用户可以引用受到影响的行值。比如:定义:createtriggerbiufer_employees_department_idbeforeinsertorupdateofdepartment_idonemployees_copyreferencingoldasold_valuenewasnew_valueforeachrowwhen(new_value.department_id《》)begin:new_value.mission_pct:=;end;/Referencing子句:执行DML语句之前的值的默认名称是:old,之后的值是:newinsert操作只有:newdelete操作只有:oldupdate操作两者都有referencing子句只是将new和old重命名为new_value和old_value,目的是避免混淆。比如操作一个名为new的表时。作用不很大。:为主健生成自增序列号droptablefoo;createtablefoo(idnumber,datavarchar());createsequencefoo_seq;createorreplacetriggerbifer_foo_id_pkbeforeinsertonfooforeachrowbeginselectfoo_seq.nextvalinto:new.idfromdual;end;/insertintofoo(data)values(‘donny’);insertintofoovalues(,’Chen’);select*fromfoo;、INSTEADOF触发器更新视图Createorreplaceviewpany_phone_bookasSelectfirst_name||’,’||last_namename,email,phone_number,employee_idemp_idFromhr.employees;尝试更新email和nameupdatehr.pany_phone_booksetname=’Chen,Donny’whereemp_id=createorreplacetriggerupdate_name_pany_phone_bookINSTEADOFUpdateonhr.pany_phone_bookBeginUpdatehr.employeesSetemployee_id=:new.emp_id,First_name=substr(:new.name,instr(:new.name,’,’)+),last_name=substr(:new.name,,instr(:new.name,’,’)-),phone_number=:new.phone_number,email=:new.emailwhereemployee_id=:old.emp_id;end;、系统事件触发器系统事件:数据库启动、关闭,服务器错误createtriggerad_startupafterstartupondatabasebegin--dosomestuffend;/、用户事件触发器用户事件:用户登陆、注销,CREATE/ALTER/DROP/ANALYZE/AUDIT/GRANT/REVOKE/RENAME/TRUNCATE/LOGOFF例子:记录删除对象.日志表createtabledroped_objects(object_namevarchar(),object_typevarchar(),dropped_ondate);.触发器createorreplacetriggerlog_drop_triggerbeforedropondonny.schemabegininsertintodroped_objectsvalues(ora_dict_obj_name,--与触发器相关的函数ora_dict_obj_type,sysdate);end;/.测试createtabledrop_me(anumber);createviewdrop_me_viewasselect*fromdrop_me;dropviewdrop_me_view;droptabledrop_me;select*fromdroped_objects禁用和启用触发器altertrigger《trigger_name》disable;altertrigger《trigger_name》enable;事务处理:在触发器中,不能使用mit/rollback因为ddl语句具有隐式的mit,所以也不允许使用视图:dba_triggers

  ⒃Oracle数据库中有关触发器问题

  ⒄触发器是一种特殊类型的存储过程它不同于存储过程触发器主要是通过事件进行触发而被执行的触发器的触发事件分可为类分别是DML事件DDL事件和数据库事件而存储过程可以通过存储过程名字而被直接调用当对某一表进行诸如UPDATEINSERTDELETE这些操作时SQLServer就会自动执行触发器所定义的SQL语句从而确保对数据的处理必须符合由这些SQL语句所定义的规则

  ⒅触发器是特定事件出现的时候自动执行的代码块类似于存储过程但是用户不能直接调用他们

  ⒆允许/限制对表的修改

  ⒇自动生成派生列比如自增字段

  ⒈触发器的种类可划分为种数据操纵语言(DML)触发器替代(INSTEADOF)触发器数据定义语言(DDL)触发器数据库事件触发器

  ⒉数据操纵语言(DML)触发器简称DML触发器是定义在表上的触发器创建在表上由DML事件引发的触发器编写DML触发器时的两点要素是确定触发的表即在其上定义触发器的表确定触发的事件DML触发器的触发事件有INSERTUPDATE和DELETE三种;替代触发器简称INSTEADOF触发器创建在视图上用来替换对视图进行的删除插入和修改操作;数据定义语言(DDL)触发器简称DDL触发器定义在模式上触发事件是数据对象的创建和修改;数据库事件触发器定义在整个数据库或模式上触发事件是数据库事件

  ⒊ORACLE产生数据库触发器的语法为

  ⒋CREATETRIGGER触发器名

  ⒌{BEFORE|AFTER|INSTEADOF}触发事件

  ⒍触发器名触发器对象的名称由于触发器是数据库自动执行的因此该名称只是一个名称没有实质的用途一个触发器可由多个不同的数据操纵语言操作触发在触发器中可用INSERTINGDELETINGUPDATING谓词来区别不同的数据操纵语言操作这些谓词可以在IF分支条件语句中作为判断条件来使用

  ⒎触发时间指明触发器何时执行该值可取触发的时间有BEFORE和AFTER两种分别表示触发动作发生在DML语句执行之前和语句执行之后确定触发级别有语句级触发器和行级触发器两种语句级触发器表示SQL语句只触发一次触发器行级触发器表示SQL语句影响的每一行都要触发一次

  ⒏Before表示在数据库动作之前触发器执行;在SQL语句的执行过程中如果存在行级BEFORE触发器则SQL语句在对每一行操作之前都要先执行一次行级BEFORE触发器然后才对行进行操作如果存在行级AFTER触发器则SQL语句在对每一行操作之后都要再执行一次行级AFTER触发器

  ⒐after表示在数据库动作之后出发器执行如果存在语句级AFTER触发器则在SQL语句执行完毕后要最后执行一次语句级AFTER触发器

  ⒑触发事件指明哪些数据库动作会触发此触发器指INSERTDELETE或UPDATE事件事件可以并行出现中间用OR连接;

  ⒒insert数据库插入会触发此触发器;

  ⒓update数据库修改会触发此触发器;

  ⒔delete数据库删除会触发此触发器

  ⒕表名数据库触发器所在的表

  ⒖foreachrow表示触发器为行级触发器省略则为语句级触发器对表的每一行触发器执行一次

  ⒗触发器的创建者或具有DROPANYTIRGGER系统权限的人才能删除触发器删除触发器的语法如下

  ⒘DROPTIRGGER触发器名

  ⒙可以通过命令设置触发器的可用状态使其暂时关闭或重新打开即当触发器暂时不用时可以将其置成无效状态在使用时重新打开该命令语法如下

  ⒚ALTERTRIGGER触发器名{DISABLE|ENABLE}

  ⒛其中DISABLE表示使触发器失效ENABLE表示使触发器生效

  同存储过程类似触发器可以用SHOWERRORS检查编译错误

  如果有多个触发器被定义成为相同时间相同事件触发且最后定义的触发器是有效的则最后定义的触发器被触发其他触发器不执行触发器体内禁止使用MITROLLBACKSAVEPOINT语句也禁止直接或间接地调用含有上述语句的存储过程定义一个触发器时要考虑上述多种情况并根据具体的需要来决定触发器的种类

  触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性除此之外触发器还有其它许多不同的功能

  ()强化约束(Enforcerestriction)

  触发器能够实现比CHECK语句更为复杂的约束

  ()跟踪变化Auditingchanges

  触发器可以侦测数据库内的操作从而不允许数据库中未经许可的指定更新和变化

  ()级联运行(Cascadedoperation)

  触发器可以侦测数据库内的操作并自动地级联影响整个数据库的各项内容例如某个表上的触发器中包含有对另外一个表的数据操作(如删除更新插入)而该操作又导致该表上触发器被触发

  ()存储过程的调用(Storedprocedureinvocation)

  为了响应数据库更新触发器可以调用一个或多个存储过程甚至可以通过外部过程的调用而在DBMS(数据库管理系统)本身之外进行操作

  由此可见触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题例如触发器能够找出某一表在数据修改前后状态发生的差异并根据这种差异执行一定的处理此外一个表的同一类型(INSERTUPDATEDELETE)的多个触发器能够对同一种数据操作采取多种不同的处理

  总体而言触发器性能通常比较低lishixinzhi/Article/program/Oracle//

  Oracle触发器问题,事件中所涉及到的数据量非常大大神指点迷津

  触发器分为语句级触发器和行级触发器,区别就是,语句级触发器没有指定FOREACHROW,只在语句执行完毕后调用一次触发器,而不管这条语句影响到多少行;行级触发器指定了FOREACHROW,当一个DML语句操作影响到数据库中的多行数据时,对于其中的每一个数据行,行级触发器均会被触发一次。。。。给分吧

  Oracle触发器调试及遇到相关问题解决

您可能感兴趣的文章:

相关文章