过程函数包和触发器_第1页
过程函数包和触发器_第2页
过程函数包和触发器_第3页
过程函数包和触发器_第4页
过程函数包和触发器_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

过程函数包和触发器第1页,共85页,2023年,2月20日,星期四理解子程序(过程、函数)及包的概念掌握如何创建、执行和删除过程、函数及包的方法了解形参和实参的区别以及不同参数模式的特征灵活使用过程、函数及包书写PL/SQL程序掌握创建和测试DML触发器、instead-of数据库触发器以及系统触发器了解数据库触发器的使用时机和限制本章要点第2页,共85页,2023年,2月20日,星期四掌握存储子程序与数据字典的交互方式及如何从SQL语句中调用存储子程序了解存储子程序和局部子程序的区别掌握存储子程序的特性。本章子要点第3页,共85页,2023年,2月20日,星期四子程序位置子程序和包可以存储在数据字典中(子程序是用命令CREATEORREPLACE创建)可以从其他PL/SQL语句块中调用已创建的子程序。子程序可以在语句块的声明段定义,以这种方式定义的子程序叫做局部子程序。包则必须存储在数据字典中,而不能是局部的。第4页,共85页,2023年,2月20日,星期四存储子程序和数据字典当使用命令CREATEORREPLACE创建子程序时,该子程序就被存储在数据字典中。子程序的信息可以通过各种数据字典视图来访问。第5页,共85页,2023年,2月20日,星期四局部子程序局部子程序:是一个在PL/SQL语句块的声明段中声明的子程序。子函数只在其声明的语句块中可见,其作用域从声明点开始到该语句块结束为止。其他语句块不能调用该函数,因为该函数对其他语句块来说是不可见的。第6页,共85页,2023年,2月20日,星期四局部子程序(续)局部子程序也可以声明为存储子程序声明段的一部分局部子程序的位置:任何局部子程序都必须在声明段的最后进行声明预先声明:局部PL/SQL子程序的名称是标识符,必须在被引用前声明。局部子程序也可以重载第7页,共85页,2023年,2月20日,星期四存储子程序和局部子程序的比较存储子程序局部子程序该类子程序以编译后生成的伪代码形式p-code存储在数据库中。当调用该类子程序时,不需进行编译即可运行局部子程序被编译为包含它的语句块的一部分。如果其所在语句块是匿名块并需要多次运行时,则该子程序就必须每次进行编译存储子程序可以从对该子程序具有EXECUTE特权的用户所提交的任何语句块中调用局部子程序只能从包含子程序的语句块中调用由于存储子程序与调用块的相互隔离,调用块具有代码少,易于理解的特点。除此之外,子程序和调用块还可以分开维护局部子程序和调用块同处于一个块内,所以容易引起混淆。如果修改了调用块的话,则该块调用的子程序作为所属块的一部分也要重新编译可以使用DBMS_SHARED_POOL.KEEP包过程来把编译后p-code代码存储在共享池中。这种方式可以改善程序性能局部子程序自身不能存储在共享池中独立的存储子程序不能进行重载,但同一包内的子程序可以重载同一块中的局部子程序可以重载第8页,共85页,2023年,2月20日,星期四存储子程序和包的注意事项优势:可以由多个数据库用户共享隐含影响:存储子程序间的依赖性包状态的处理方法运行存储子程序包所需要的特权第9页,共85页,2023年,2月20日,星期四子程序的依赖性依赖:数据字典记录了存储过程或函数所引用的所有Oracle对象。该过程或函数就依赖于这些存储的对象。自动重编译:如果一个依赖对象失效,PL/SQL引擎将在该对象再次被调用时对其重新进行编译。包的依赖性:包体的变化不会导致修改包头。因此,其他依赖于该包头的对象也不需要进行重新编译。如果该包头有变化,则会使包体自动失效,这是因为该包体依赖于包头。如何确定无效:通过数据字典在不断地跟踪对象间依赖性第10页,共85页,2023年,2月20日,星期四包运行时状态当第一次实例化一个包时,将从磁盘中读入该包的伪代码并将其放入系统全局工作区SGA的共享池中。包的运行时状态,即打包的变量和游标,则存放在用户全局区(UGA)的会话存储区中。这就保证了每个会话都将有其运行时状态的副本。可串行复用包和非串行复用包:PL/SQL2.3版及更高版本允许程序员对包做可串行复用标志。第11页,共85页,2023年,2月20日,星期四包运行时状态可串行复用包非串行复用包运行时状态保存在SGA中,每次数据库调用后都将该运行时状态释放运行时状态保存在UGA中,其生存期与数据库会话相同所用的最大内存与同时使用该包的用户数成正比所用的最大内存与当前登录的用户数成正比第12页,共85页,2023年,2月20日,星期四特权和存储子程序存储子程序和包都是数据库字典中的对象,因而,它们属于特殊的数据库用户或模式。如果用户被授予了正确的特权,则它们就可以访问这些对象。当创建一个存储对象时,考虑到子程序内部的访问可用性,特权和角色也开始起作用。第13页,共85页,2023年,2月20日,星期四EXECUTE特权

为了能够对表进行访问,必须使用SELECT,INSERT,UPDATE和DELETE对象特权。GRANT语句把这些特权赋予数据库用户或角色。对于存储子程序和包来说,相关的特权是EXECUTE。第14页,共85页,2023年,2月20日,星期四第15页,共85页,2023年,2月20日,星期四第16页,共85页,2023年,2月20日,星期四存储子程序和角色子程序使用显式地(而不是通过角色)授权其所有者的特权而执行。为了使通过角色授权的特权作用在存储子程序和触发器内被使用,每次运行过程时,必须对该特权进行检查。第17页,共85页,2023年,2月20日,星期四调用者的权限与定义者的权限Oracle提供了不同的外部引用解决方案。在调用者的权限子程序中,外部引用是通过调用者而不是所有者的特权设置而执行的。调用者的权限程序是通过使用AUTHID子句而创建,该语句只适用于独立子程序、包说明和对象类型说明。在包内部或对象类型中的独立子程序必须都是调用者子程序或都是定义者子程序,而不能混合。第18页,共85页,2023年,2月20日,星期四AUTHID的语法如下:CREATE[ORREPLACE]FUNCTIONfunction_name[parameter_list]RETURNreturn_type[AUTHID{CURRENT_USER|DEFINER}]{IS|AS}function_body;CREATE[ORREPLACE]PROCEDUREprocedure_name[parameter_list][AUTHID{CURRENT_USER|DEFINER}]{IS|AS}function_body;CREATE[ORREPLACE]PACKAGEpackage_spec_name[AUTHID{CURRENT_USER|DEFINER}]{IS|AS}package_spec;CREATE[ORREPLACE]TYPEtype_name[AUTHID{CURRENT_USER|DEFINER}]{IS|AS}OBJECTtype_spec;第19页,共85页,2023年,2月20日,星期四默认参数从过程化语句中调用一个函数时,如果该函数有形参的话,可以使用其缺省值。然而,如果从SQL语句调用函数时,必须指定所有参数。必须使用位置对应法(PositinalNotation),而不能使用名称对应法(NameNotation)。第20页,共85页,2023年,2月20日,星期四从Oracle中从SQL语句调用函数从Oracle起,从DML语句中调用的函数既不可以从正在被该DML语句修改的数据库表读取数据,也不能对其进行修改,但该函数可以更新其他表。第21页,共85页,2023年,2月20日,星期四包的辅助功能共享池锁定包体长度的限制优化参数第22页,共85页,2023年,2月20日,星期四共享池锁定DBMS_SHARED_POOL包允许程序员把一个对象锁定在共享池中。当该对象被锁定后,除非由程序申请对其清除,否则无论共享池有多满,也不管是否有程序访问该对象,该对象将常驻在共享池中。这种处理方法有利于提高程序的运行效率,因为从系统的磁盘重新装入对象要进行大量读写操作。锁定对象还有助于最大限度地减少共享池的碎片。第23页,共85页,2023年,2月20日,星期四包体长度的限制编译器对包体长度的限制如下:Diana树中的节点数。在Oracle8i之前的版本中,Diana节点的最大数目是32K,Oracle8i以上版本将包体和类型体的限制扩充到了64兆字节的容量。编译器生成的临时中间变量的容量最多21K字节。入口点的数量。一个包体最多可以有32K个入口点,入口点可以是过程或函数。字符串的数量。PL/SQL对字符串的限制单位是232。第24页,共85页,2023年,2月20日,星期四优化参数使用DETERMINISTIC和PARALLEL_ENABLE关键字,PL/SQL编译优化器将会对调用PL/SQL函数进行优化。该关键字要放在函数的返回类型和IS或AS子句之间。CREATE[ORREPLACE]FUNCTIONfunction_name[parameter_list]RETURNreturn_type[DETERMINISTIC][PARALLEL_ENABLE]IS|ASfunction_body;第25页,共85页,2023年,2月20日,星期四小结通过访问各种数据库字典视图来查询子程序的信息。user_objects视图包含了当前用户拥有的所有对象的信息。user_source视图包含对象的源程序代码。user_errors视图则包含编译错误的信息。预先声明可以解决函数之间相互调用的问题。子程序引用其他数据库对象时,该子程序依赖于那个对象。如果修改了被引用对象,那么依赖对象的状态将更改为无效,指出需要重新编译。在PL/SQL中使用的函数可以使用额外的限制,这被称为纯度等级。共享池是在子程序运行时包含已编译子程序伪代码及其他代码的SGA的一部分。KEEP过程用来在共享池中锁定对象。UNKEEP过程实现从共享池中删除锁定对象。SIZES过程用来把共享池的内容输出到屏幕。PL/SQL编译优化器使用DETERMINISTIC和PARALLEL_ENABLE关键字对调用PL/SQL函数进行优化。第26页,共85页,2023年,2月20日,星期四

数据库开发技术

第14章(下)数据库触发器福建工程学院第27页,共85页,2023年,2月20日,星期四

本章要点理解数据库触发器、变异表和约束表的概念及数据库触发器的语法掌握如何在SQL*PLUS中创建和测试DML触发器、instead-of数据库触发器以及系统触发器了解数据库触发器的使用时机和限制。第28页,共85页,2023年,2月20日,星期四触发器的概念作为数据库对象的触发器是一个与表相关联的被存储的PL/SQL程序。每当一个特定的数据操作语句在指定的表上发生时,就会引发触发器的执行。与存储子程序的调用方式不同,触发器的执行是采用触发机制第29页,共85页,2023年,2月20日,星期四触发器的定义和使用触发器是当特定事件出现时自动执行的存储过程特定事件可以是执行更新的DML语句和DDL语句触发器不能被显式调用触发器的功能:自动生成数据自定义复杂的安全权限提供审计和日志记录启用复杂的业务逻辑第30页,共85页,2023年,2月20日,星期四触发器的类型触发器主要有三种类型:DMLINSTEAD-OF触发器系统触发器。触发器的应用,主要用于:维护那些通过创建表时的声明约束无法实现的复杂的完整性约束。通过记录已进行的改变以及是谁进行了该项改变来检查一个表中的信息。当一个表发生改变时,自动向其他程序发送需要采取行动的信号。在一个发布-预订环境中发布有关各种事件的信息。第31页,共85页,2023年,2月20日,星期四DML触发器DML触发器可以由DML语句激发由DML语句的类型决定DML触发器的类型。DML触发器可以在DML语句操作之前或之后激发。DML触发器也可以在行或语句操作上激发。第32页,共85页,2023年,2月20日,星期四INSTEAD-OF触发器INSTEAD-OF触发器是行级别的,执行时,激发它的DML语句不执行。只能定义在视图上。Oracle8及更高版本才提供。第33页,共85页,2023年,2月20日,星期四系统触发器系统触发器在发生诸如数据库启动或关闭等系统事件时激发,而不是在执行DML语句时激发。系统触发器也可以在DDL操作时,如表的创建时被激发。第34页,共85页,2023年,2月20日,星期四创建触发器CREATE[ORREPLACE]TRIGGERtrigger_name{BEFORE|AFTER|INSTEADOF}triggering_eventreferencing_clause[WHENtrigger_condition][FOREACHROW]trigger_body;第35页,共85页,2023年,2月20日,星期四Createorreplacetriggeremp_tBeforeinsertorupdateordeleteOnempBeginIfto_char(sysdate,'dy')='星期日'thenRaise_application_error(-20000,'todayisholiday!!!');Endif;--抛出一个异常,但不做异常处理。End;

当执行一条删除语句在星期六对emp表进行删除操作时:Deletefromempwhereeno=‘eo1’;那么将会删除成功,如果是在星期日执行这条语句,则触发器的异常导致本应继续执行的触发语句不再执行,删除未成功。创建触发器第36页,共85页,2023年,2月20日,星期四AFTER子句AFTER:表示触发语句正常执行后,触发器被触发。注意:虽然触发器是在触发语句之后触发,但是如果触发器代码出现异常时,在此之前执行的触发语句无效。例:第37页,共85页,2023年,2月20日,星期四Createorreplacetriggeremp_testAfterdeleteOnempBeginRaise_application_error(-20000,'testmessage!');End;当执行一条语句对emp表中的数据进行删除时,Deletefromempwhereempno='7369';该语句执行完后,触发器被触发,但触发器抛出一个异常,所以已执行的删除语句无效,实际上并没有删除7369职工记录。AFTER子句第38页,共85页,2023年,2月20日,星期四触发语句和触发器的相互影响系统是将触发语句和触发器的执行作为一个整体来看待的。无论是BEFORE还是AFTER触发器,触发器有异常,触发语句都会撤消;而触发语句出现异常,触发器的工作也会撤消。例:Createorreplacetriggeremp_t1BeforeinsertorupdateordeleteOnempBeginInsertintotempvalues('insertemp!');End;/第39页,共85页,2023年,2月20日,星期四当执行一条插入语句时:Insertintoemp(empno)values('7369');如果发生主码重复,插入语句错误时查看temp表为空,触发器所做的工作被撤消。如果插入合法的话,再查看temp表,则有一行“insertemp!”触发语句和触发器的相互影响第40页,共85页,2023年,2月20日,星期四INSTEADOF子句INSTEADOF:表示不执行触发语句,而是执行触发器代码。相当于用触发器代码替代了触发语句所做的工作。注意:该子句仅用于建立视图上的触发器,而且默认为行触发器。例:编写一个触发器emp_view_t,其功能是禁止对emp_view视图进行所有的操作,并输出有关提示信息。第41页,共85页,2023年,2月20日,星期四假设视图定义如下:Createviewemp_viewasSelect*fromemp;触发器代码如下:Createorreplacetriggeremp_view_tInsteadofinsertorupdateordeleteOnemp_viewBeginInsertintotempvalues('emp_view视图不能修改');End;INSTEADOF子句第42页,共85页,2023年,2月20日,星期四启用及禁用触发器和删除触发器禁用触发器:Altertriggeremp_tdisable;启用触发器:Altertriggeremp_tenable;删除触发器:Droptriggeremp_t;

对数据库数据管理,例如大量数据的导入导出时候,一般需要禁止某些触发器,以增加效率。第43页,共85页,2023年,2月20日,星期四FOREACHROW子句该子句定义触发器为“行级触发器”,而没有指定该子句的触发器是一个“语句级的触发器”第44页,共85页,2023年,2月20日,星期四创建DML触发器第45页,共85页,2023年,2月20日,星期四行级触发器前面所讲的都是语句级触发器,触发器只对每条语句触发一次。而行级触发器的触发次数与触发语句所处理的记录有关,对每一条记录都触发一次触发器例:对如下的更新语句(假设已存在触发器)Updateempsetsal=sal*1.1whereage>50andsal<500;假设该条语句更新了5条记录,则对于语句级触发器来说只触发一次触发器,而对于行级触发器来说它触发5次该触发器。第46页,共85页,2023年,2月20日,星期四DML触发器激发顺序如果存在语句之前的触发器,先执行该触发器。对于受语句影响每一行:如果存在行之前的触发器,执行该触发器。执行该语句本身。如果存在行之后的触发器,执行该触发器。如果存在语句之后的触发器,运行该触发器。第47页,共85页,2023年,2月20日,星期四总结:各触发器的触发顺序如下

Before语句级before行级触发语句after行级after语句级举例:假如在emp表上建立了4个触发器,它们定义如下Createorreplacetriggeremp_t1BeforeupdateonempBeginInsertintotoutvalues('beforeupdate语句触发器');End;DML触发器激发顺序

第48页,共85页,2023年,2月20日,星期四Createorreplacetriggeremp_t2BeforeupdateonempForeachrowBeginInsertintotoutvalues('beforeupdate行触发器');End;Createorreplacetriggeremp_t3AfterupdateonempForeachrowBeginInsertintotoutvalues('afterupdate行触发器');End;DML触发器激发顺序

第49页,共85页,2023年,2月20日,星期四Createorreplacetriggeremp_t4AfterupdateonempBeginInsertintotoutvalues('afterupdate语句触发器');End;测试这4个触发器触发顺序如下:Updateempsetsal=sal*1.1;--假设emp表现有两条记录DML触发器激发顺序

第50页,共85页,2023年,2月20日,星期四Select*fromtout;--查看触发器的触发情况-----------------------------------------------------------Beforeupdate语句触发器Beforeupdate行触发器Afterupdate行触发器Beforeupdate行触发器Afterupdate行触发器……Afterupdate语句触发器DML触发器激发顺序

重复14次第51页,共85页,2023年,2月20日,星期四行级别触发器的相关标识符

触发语句处理每一行时,行级别触发器都激发一次。在触发器内部,可以通过相关标识符:old和:new访问正在处理中的行的数据。标识符:old和:new也被称为伪记录。第52页,共85页,2023年,2月20日,星期四OLD代表修改前的行,所以修改之前当前各列的值可分别用(如表emp)

OLD.empno,OLD.ename,OLD.job,OLD.sal,OLD.mgr,OLD.deptno等。NEW代表修改之后当前行各列的值可分别用

NEW.empno,NEW.ename,NEW.job,NEW.sal,NEW.mgr,NEW.deptno等。注意:如果是在PL/SQL块内访问关联名,需要在关联名前加冒号,如同访问外部变量一样,而在PL/SQL块外访问则不需加冒号。行级别触发器的相关标识符

第53页,共85页,2023年,2月20日,星期四NEW和OLD应用举例如果用户希望触发器做这样的工作:对修改职工工资的操作进行合法性检查。其检查内容如下:修改后的工资要大于修改前的工资工资增量不能超过原工资的10%目前没有单位的职工不能长工资则为了实现上述功能,触发器应该在UPDATE语句修改每一个记录时都要使触发器触发一次。第54页,共85页,2023年,2月20日,星期四Createorreplacetriggeremp_line_tBeforeupdateofsalOnempForeachrowBeginIf:new.sal<=:old.salthenRaise_application_error(-20000,:old.empno||'工资没增长');Elsif:new.sal>:old.sal*1.1thenRaise_application_error(-20000,:old.empno||'工资增长超过10%');Elsif:old.deptnoisnullthenRaise_application_error(-20000,:old.empno||'无单位,不能增长');Endif;End;NEW和OLD应用举例第55页,共85页,2023年,2月20日,星期四:old和:new相关标识符注意:old标识符对INSERT语句未定义,而:new标识符对DELETE语句未定义。PL/SQL编译器不会对在INSERT语句中使用的:old和在DELETE语句中使用的:new标识符报错,编译的结果将使这两者的字段值为NULL。第56页,共85页,2023年,2月20日,星期四WHEN子句

语法:WHENtrigger_condition行触发器顾名思义就是对每一行都触发,但有时只需对某些行触发,而另外一些行则不需要触发,我们用WHEN条件子句可以做到这一点。WHEN子句只适用于行级别触发器。如果使用该子句,触发器体将只对满足由WHEN子句指定条件的行而执行。语法:WHENtrigger_condition第57页,共85页,2023年,2月20日,星期四带WHEN子句的触发器举例CreateorreplacetriggerchecksalBeforeinsertorupdateofsalonempForeachrowWhen(new.sal>2000)--在PL/SQL块外NEW不用冒号Begin/*Triggerbody*/End;第58页,共85页,2023年,2月20日,星期四触发器谓词

条件谓词可用在触发器代码中判断触发语句的种类几个谓词如下:第59页,共85页,2023年,2月20日,星期四使用触发器谓词举例该例子功能是当插入或删除的职工记录属于30部门时,记录下操作的时间,语句种类(插入/删除)和涉及的职工号。Createorreplacetriggeremp_t2AfterinsertordeleteOnempForeachrowWhen(old.deptno=‘30’ornew.deptno=‘30’)DeclareSvarchar2(50);第60页,共85页,2023年,2月20日,星期四BeginS:=to_char(sysdate,’YY_MON_DDHH24:SS’);IfinsertingthenInsertintotoutValues(s||’插入30部门一个记录,职工号为:

‘||:new.empno);ElsifdeletingthenInsertintotoutValues(s||’删除30部门一个记录,职工号为:

‘||:old.empno);Endif;End;使用触发器谓词举例用触发器跟踪对表的DML操作信息,提供审计和日志记录。第61页,共85页,2023年,2月20日,星期四创建instead-of触发器instead-of触发器用于以下两种情况:允许修改一个本来无法修改的视图。修改视图中嵌套表列的列。第62页,共85页,2023年,2月20日,星期四可更改的与不可更改的视图

可更改视图:可以发出DML命令的视图。一般来说,视图如果不包括下列命令中的任何一项,它就是一个可更改视图。1、集合操作符(UNION、UNIONALL、MINUS)2、聚集函数(SUM、AVG等)3、GROUPBY、CONNECTBY或STARTWITH子句4、DISTINCT操作符5、连接第63页,共85页,2023年,2月20日,星期四可更改连接视图的条件如果一个视图是不可更改的,则可以在其上编写一个instead-of触发器来执行正确的操作,从而使该视图可更改。如果需要进行其他处理的话,也可以在可更改视图上编写instead-of触发器。第64页,共85页,2023年,2月20日,星期四创建INSTEAD-OF触发器实例假设职工记录分别存储在表emp1(empno,ename,deptno)和表emp2(empno,ename,deptno)中。emp1存放10~30部门的职工记录,其它部门的职工记录存放在emp2中。建立一个视图,包含全部职工记录,该视图定义如下:Createviewemp_viewasSelect*fromemp1UnionallSelect*fromemp2;第65页,共85页,2023年,2月20日,星期四视图建好后,如果向视图插入职工记录,系统很难实现将不同部门职工记录插入到不同的表中。下面操作结果将出错:Insertintoemp_viewvalues(‘e04’,’aaa’,’d04’);--此视图的数据类型操纵操作非法为了实现对该视图的插入,我们在视图emp_view上建立一个触发器emp_view_t,实现对视图的插入操作。触发器定义如下:

createorreplacetriggeremp_view_tInsteadofinsertOnemp_view创建INSTEAD-OF触发器实例第66页,共85页,2023年,2月20日,星期四视图建好后,如果向视图插入职工记录,系统很难实现将不同部门职工记录插入到不同的表中。下面操作结果将出错:Insertintoemp_viewvalues(‘e04’,’aaa’,’d04’);--此视图的数据类型操纵操作非法为了实现对该视图的插入,我们在视图emp_view上建立一个触发器emp_view_t,实现对视图的插入操作。触发器定义如下:

createorreplacetriggeremp_view_tInsteadofinsertOnemp_view创建INSTEAD-OF触发器实例第67页,共85页,2023年,2月20日,星期四ForeachrowBiginIf(:new.deptnoisnull)thenRaise_application_error(-2000,’部门空,不能插入‘);Elsif(:new.deptnoin(‘d01’,’d02’,’d03’))thenInsertintoemp1values(:new.eno,:new.ename,:new.deptno);ElseInsertintoemp2Values(:new.eno,:new.ename,:new.deptno);Endif;End;第68页,共85页,2023年,2月20日,星期四创建系统触发器系统触发器可以在两种不同种类的事件(即DDL或数据库)上激发。DDL事件包括CREATE、ALTER或DROP语句。而数据库事件包括服务器的启动或关闭,用户的登录或退出,以及服务器错误。语法:CREATE[ORREPLACE]TRIGGER[schema.]trigger_name{BEFORE|AFTER}{ddl_event_list|database_event_list}ON{DATABASE|[schema.]SCHEMA}[when_clause]trigger_body;第69页,共85页,2023年,2月20日,星期四系统DLL和数据库事件第70页,共85页,2023年,2月20日,星期四数据库与模式触发器

系统触发器可以在数据库级别或模式级别定义。数据库级别的触发器不管触发事件何时发生都将激发,而模式级别触发器只有在指定的模式的触发事件发生时才会激发。DATABASE和SCHEMA关键字决定了给定系统触发器的级别。如果没有用关键字SCHEMA来说明模式,则它就是拥有该触发器的默认模式。第71页,共85页,2023年,2月20日,星期四事件属性函数

事件属性函数属系统触发器内部使用。在程序中使用事件属性函数必须在它们的前面加上前缀SYS。第72页,共85页,2023年,2月20日,星期四事件属性函数列表说明第73页,共85页,2023年,2月20日,星期四使用SERVERERROR事件

SERVERERROR事件可以用于跟踪数据库中发生的错误。错误代码可以使用触发器内部的SERVER_ERROR属性函数取出。该函数只能确定堆栈中的错误码。但不能返回与该错误码相关的错误信息。第74页,共85页,2023年,2月20日,星期四系统触发器和事务

系统触发器的事务行为与触发事件有关。系统触发器可以作为基于触发器正常结束时提交的独立事务激发,也可以作为当前用户事务的一部分激发。STARTUP,SHUTDOWN,SEVERERROR和LOGON触发器都是由独立事务激发的,而LOGOFF和DDL触发器则作为当前事务的一部分被激发。触发器实现的任务将被提交处理。在使用DDL触发器的情况下,当前事务(也就是CREATE、ALTER或DROP语句)将自动提交。LOGOFF触发器的操作也将作为会话中最后事务的一部分提交。第75页,共85页,2023年,2月20日,星期四系统触发器和WHEN子句

系统触发器可以使用WHEN子句来指定触发器激发条件。然而,对每一种系统触发器所指定的条件类型有如下限制:STARTUP和SHUTDOWN触发器不能带有任何条件。SERVERERROR触发器只可以使用ERRNO测试来检查具体错误。LOGON和LOGOFF触发器可以使用USERID或USERNAME测试来检查用户标识符或用户名。DDL触发器可以检查正在被修改的对象的名称和类型。第76页,共85页,2023年,2月20日,星期四其他触发器问题触发器名称的命名空间(Name-space)使用触发器的各种限制和不同种类的触发器体。与触发器有关的权限问题第77页,共85页,20

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论