2024年9月oracle数据库,触发器有什么用途,请用实例说明一下?请列举几种常用的触发器
⑴oracle数据库,触发器有什么用途,请用实例说明一下?请列举几种常用的触发器
⑵比如:定义: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,比如自增字段、强制数据一致性、提供审计和日志记录、防止无效的事务处理、启用复杂的业务逻辑开始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,、建立试验表createtableemployees_copyasselect*fromhr.employees、建立日志表createtableemployees_log(whovarchar(),whendate);、在employees_copy表上建立语句触发器,Createorreplacetriggerbiud_employee_copyBeforeinsertorupdateordeleteOnemployees_copyBeginInsertintoemployees_log(Who,when)Values(user,sysdate);End;/、测试updateemployees_copysetsalary=salary*.;select*fromemployess_log;、确定是哪个语句起作用,也只会调用一次update语句触发器,触发器类型:、语句触发器、行触发器、INSTEADOF触发器、系统条件触发器、用户事件触发器、语句触发器是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器,各个语句触发器都只会针对指定语句激活一次,例子:需要对在表上进行DML操作的用户进行安全检查。
⑶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
⑸请列举几种常用的触发器
⑹SQLServer有三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。DML触发器,当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行;DDL触发器,它是SqlServer新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作;登录触发器,登录触发器将为响应LOGIN事件而激发存储过程。与SQLServer实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。