`
wenhai_zhang
  • 浏览: 185964 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

重温Oracle(9)

 
阅读更多

 

第二十三章 触发器

 

存放在数据库中,并被隐含执行的存储过程。在oracle8i之前,只允许给予表或者视图的DML的操作,而从8i开始,不仅可以支持DML触发器,也允许给予系统事件和DDL的操作。

 

语句触发器

Defore语句触发器

Create or replace trigger tr_src_emp

before insert or update or delete on emp

begin

  if to_char(sysdate,’dy’,’nls_language=AMERICAN’) in(‘STA’,’SUN’) then raise_application_error(-20001,’can’t modify user information in weekend’);

end if;

end;

/

 

条件触发器

Create or replace trigger tr_src_emp

before insert or update or delete on emp

begin

  if to_char(sysdate,’dy’) in (’星期六’,’星期天’) then

case

when inserting then

raise_application_error(-20001,’fail to insert’);

         when updating then

         when deleting then

         end case;

end if;

end;

/

 

 

Alter语句触发器

统计EMP表上的增删改的次数,先建一张表

Create table audit_table( name varchar2(20),ins int,udp int,del int,starttime date,endtime date);

 

建立触发器

Create or replace trigger tr_audit_emp

After insert or update or delete on emp

Declare

V_temp int;

Begin

Select count(*) into v_temp from audit_table where name=’EMP’;

If v_temp=0 then

  Insert into audit_table values(‘EMP’,0,0,0,sysdate, null);

End if;

Case

 When inserting then

  Update audit_table set ins=ins+1,endtime=sysdate

 

行触发器

执行DML操作时,每作用一行就出发一次。

Before行触发器

Create or replace trigger tr_emp_sal

Before/after update of sal on emp

For each row

Begin

If :new.sal <:0ld.sal then

  Raise_application_error(-20010,’sal should not be less’);

End if;

End;

/

 

注意事项:

编写DML触发器的时候,触发器代码不能从触发器所对应的基表读取数据。

 

触发器的主要用途

控制数据安全:例如在非工作时间不能对表进行操作等。

实现数据统计:例如记载员工的工资变化等。

实现数据的完整性:如果限制员工的工资不能低于800,可以选择check约束,但如果是限定新工资不能低于其原来工资,也不能高于20%,则无法通过约束实现。

实现参照完整性:约束可实现级联删除,却不能实现级联更新。

 

系统事件触发器

系统事件触发器是指基于Oracle系统事件(例如LOGONSTARTUP)所建立的触发器。通过使用系统事件触发器,提供了跟踪系统或数据库变化的机制。下面介绍一些常用的系统事件属性函数,以及建立各种事件触发器的方法。

1, 常用事件属性函数

建立系统事件触发器时,应用开发人员经常需要使用事件属性函数。常用的时间属性函数如下:

Ora_client_ip_address:用于返回客户端的IP地址;

Ora_database_name:用户返回当前数据库名;

Ora_des_encrypted_password:用于返回DES加密后的用户口令;

Ora_dict_obj_name:用于返回DDL操作所对应的数据库对象名;

Ora_dict_obj_name_list(name_list out ora_name_list_t):用于返回在事件中被修改的对象名列表;

Ora_dict_obj_owner:用于返回DDL操作所对应的对象的所有者名;

Ora_dict_obj_owner_list(owner_list OUT ora_name_list_t):用于返回在事件中被修改对象的所有者列表;

Ora_dict_obj_type:用于返回DDL操作所对应的数据库对象的类型;

Ora_grantee(user_list OUT ora_name_list_t):用于返回授权事件的授权者;

Ora_instance_num:用于返回实例进程号;

Ora_is_after_column(column_name IN VARCHAR2):用于检测特定列是否被修改;

Ora_is_creating_nested_table:用于检测是否正在建立嵌套表;

Ora_is_drop_column(column_name IN varchar2):用于检测特定列是否被删除;

Ora_isservererror(error_number):用于检测是否返回了特定Oracle错误;

Ora_login_user:用于返回登录用户名;

Ora_sysevent:用于返回触发触发器的系统事件名。

2,  案例启动和关闭触发器

记载实例启动和关闭的事件和时间,首先建立事件表event_table,示例如下:

SQL>conn sys/oracle as sysdba

SQL>create table event_table(event varchar2(30), time date);

在建立了事件表之后,就可以在触发器中引用该表了。注意,实例启动触发器和实例关闭触发器只有特权用户才能建立,并且实例启动触发器只能使用after关键字,二实例关闭触发器只能使用before关键字。

Create or replace trigger tr_startup

After startup on database

Begin

  Insert into event_table values(ora_sysevent, sysdate);

End;

/

Create or replace trigger tr_shutdown

Before shutdown on database

Begin

  Insert into event_table values(ora_sysevent, sysdate);

End;

/

在建立了启动/关闭触发器之后,当打开数据库之后/关闭实例之前,会执行该触发器的相应代码,但shutdown abort命令不会触发该触发器。

3, 登录和退出触发器

为了记录用户登录和退出事件,可以分别建立登录和退出触发器。为了记载登录用户和退出用户的名称、时间和IP地址,应该首先建立专门存放登录和退出的信息表log_table。示例如下:

SQL>conn sys/oracle as sysdba

SQL>create table log_table(username varchar2(20,logon_time date,logoff_time date,address varchar2(20));

在建立了表之后,就可以再触发器中引用该表了。注意,登录触发器和退出触发器一定要以特权用户身份建立,并且登录触发器只能在after关键字,而退出触发器只能使用before关键字。示例如下:

Create or replace trigger tr_logon

After logon on database

Begin

  Insert into log_table(username,logon_tine,address) values(ora_login_user,sysdate,ora_client_ip_address);

End;

/

Create or replace trigger tr_logoff

After logoff on database

Begin

  Insert into log_table(username,logoff_tine,address) values(ora_login_user,sysdate,ora_client_ip_address);

End;

/

在建立了登录/登出触发器之后,当用户登录到数据库之后/断开数据库连接之前,会执行器触发器代码。

4,  DDL触发器

为了记载系统所发生的DDL事件(CREATE,ALTER,DROP等),可以建立DDL触发器。为了记载DDL事件,应该建立专门的表,以便存放DDL事件信息。示例如下:

SQL>conn sys/oracle as sysdba

SQL>create table event_ddl(event varchar2(20),username varchar2(10),owner varchar2(10),objname varchar2(20),objtype varchar2(10),time date);

建立了表之后,就可以再触发器中引用该表了。注意,当建立DDL触发器时,必须使用after关键字。示例如下:

Create or replace trigger tr_ddl

After ddl on scott.schema

Begin

  Insert into event_ddl values(ora_sysevent,ora_login_user,ora_dict_obj_owner,ora_dict_obj_name,ora_dict_obj_type,sysdate);

End;

/

在建立了触发器之后,如果在SCOTT方案对象上执行了DDL操作,则会将该信息记录到表中。

 

管理触发器

显示触发器信息:建立触发器时,oracle会将触发器信息写入到数据字典中,通过查询数据字典视图USER_TRIGGERS,可以显示当前用户所包含的所有触发器信息。

禁止触发器:禁止触发器是指使触发器临时失效。当触发器处于enable状态时,如果在表上执行DML操作,则就会触发相应的触发器。如果给予insert操作建立了触发器,当使用SQL*Loader状态大批量数据时会触发触发器。如果加快数据装载速度,应该在装载数据之前禁止触发器。禁止/激活触发器SQL如下:        SQL>alter trigger tr_check_sal disable/enable;

禁止或激活表的所有触发器:SQL>alter table emp disable/enable all triggers;

重新编译触发器:当使用alter table命令修改表结构(例如增加或删除列)时,会使得其触发器转变为invalid状态。在这种情况下需要重新编译触发器。SQL>alter trigger tname compile;

删除触发器:在表上的触发器也刴,对于DML操作的性能影响也越大,因此当触发器不在需要时,应及时删除。SQL>drop trigger tr_check_sal;

 

第二十三章 事务(数据库系统概论)

 

事务控制

oracle中每个连接都会产生一个session,一个session对数据库的修改,不会立刻反映到数据库的真实数据上,是允许回滚的。只有当提交了,才变成持久数据了。

可能出现死锁的情况。

事务的特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

 

原子性和一致性的差别

原子性:只一个事务中,包含若干个数据草组,这些操作是一个整体,要不一起完成,要不一起不完成,不能只完成其中的一部分。比如银行转账,A账户减操作和B账户加操作要不都成功,要不都失败。

一致性:是指数据库从一个完整的状态跳到另一个完整的状态,是用于保护数据库的完整性的。比如外键修改,如果外键表没有此信息,则违反了数据库的一致性。

 

 

张文海

分享到:
评论

相关推荐

    数据库Oracle教程

    本教程旨在帮助你重温或深入学习Oracle数据库的基础知识及高级特性,让你在数据库管理领域更加得心应手。 首先,Oracle数据库的核心概念包括数据模型、SQL语言、数据库架构和事务管理。数据模型是数据库设计的基础...

    oracle基础知识回顾与练习.zip

    总的来说,“oracle基础知识回顾与练习.zip”提供了全面的Oracle SQL学习路径,无论你是初学者还是希望重温基础的开发者,都能从中受益。通过系统学习和实践,你可以逐步掌握Oracle数据库的关键技能,为未来的职业...

    zkoss CE6.0+spring3.0.5+hibernate3.6+oracle10g+mysql5最全包

    这是一个关于企业级应用开发的集成环境包,包含了前端框架ZKoss CE6.0、后端框架Spring3.0.5、ORM框架Hibernate3.6,...对于想要了解早期Java开发技术或者重温旧有技术栈的开发者来说,这是一个非常有价值的参考资料。

    行业-89 再次重温写出各种SQL语句的时候,会用什么执行计划?(2).rar

    DBMS还提供了查询分析工具,如Oracle的Explain Plan或SQL Server的Execution Plan,它们能展示每一步的预计成本、实际资源消耗和操作顺序,帮助开发者理解并优化执行计划。 总结来说,"行业-89 再次重温写出各种SQL...

    行业-88 再次重温写出各种SQL语句的时候,会用什么执行计划?(1).rar

    本资料“行业-88 再次重温写出各种SQL语句的时候,会用什么执行计划?(1)”很可能是探讨SQL查询执行计划的一份深入教程,旨在帮助读者掌握如何分析和优化SQL语句的执行流程。 首先,执行计划包括以下几个关键元素...

    行业-90 再次重温写出各种SQL语句的时候,会用什么执行计划?(3).rar

    1. 使用EXPLAIN或EXPLAIN PLAN:在大多数数据库系统(如MySQL、PostgreSQL、Oracle等)中,可以在SQL语句前加上`EXPLAIN`或`EXPLAIN PLAN`关键字来查看执行计划。 2. 查询分析器:某些数据库管理系统(如SQL Server...

    java培训实习总结.doc

    在实习期间,学员们重温了Java的基础语法、类和对象的概念,以及异常处理等关键知识。 2. **JavaWeb开发**:JavaWeb技术包括Servlet和JSP,它们是构建动态Web应用的重要工具。Servlet是一个Java类,用于扩展服务器...

    2020年软件测试顶岗实习报告总结.docx

    (2) 工作方法:在编写测试用例的过程中,我重温了编程基础知识,并积极寻求同事的帮助。我认识到,不断积累知识和经验,以及将遇到的问题和解决方案铭记于心,是提升工作效率的关键。 (3) 工作责任:在公司,我视...

    SQL-4 数据库知识

    本文将深入探讨SQL的多个重要知识点,帮助读者重温或掌握这些基础概念。 1. 数据库基础 - 数据库:是存储和管理数据的系统,如Oracle、MySQL、SQL Server等。 - 关系型数据库:基于关系理论,通过表格形式展示...

    java培训实习报告.docx

    2. **Core Java**:从基础的变量、运算符到控制结构,实习生重温了Java的核心概念,这是所有Java开发的基础。 3. **SQL和数据库**:学习了SQL语言,包括基础和优化,以及Oracle数据库开发和PL/SQL,这是处理数据和...

    PB学习手册附阅读器

    6. **数据库连接**:讲述如何配置数据源,使用ADO、ODBC或OLE DB等方式连接不同的数据库系统,如SQL Server、Oracle、MySQL等。 7. **应用程序部署**:介绍PB应用程序的编译、发布和部署过程,包括生成可执行文件和...

    陆卫康的VFP技术文章和示例

    6. **网络与数据库连接**:VFP可以与其他数据库(如SQL Server、Oracle等)进行连接,实现数据交换和处理。 7. **数据可视化**:VFP支持图表和图形的创建,便于数据可视化展示。 8. **脚本语言**:VFP的命令式语言...

    mapinfo 4 安装程序

    再者,MapInfo 4具备数据库集成能力,可以与多种数据库系统无缝对接,如Microsoft Access、Oracle和SQL Server等。这使得用户可以直接在GIS环境中进行数据库操作,实现地理数据与业务数据的结合。 安装过程中,用户...

    delphi7绿色精简版.rar

    5. **数据库支持**:Delphi 7内置了ADO(ActiveX Data Objects)组件,可以方便地连接和操作各种数据库,如SQL Server、Oracle、MySQL等。 6. **Unicode支持**:虽然Delphi 7相对较旧,但它已经支持Unicode,允许...

    borland c biulder BC 编程工具

    8. **数据库集成**:BC++ Builder提供了与各种数据库系统的良好集成,包括InterBase、Oracle、SQL Server等,通过其DataSnap技术,可以轻松实现客户端和服务器之间的数据交换。 9. **文档和社区支持**:尽管这款...

    myeclipse3.83企业稳定版(非常稀少的资源)

    在数据库管理上,MyEclipse 3.83内置了数据库连接工具,可以方便地创建、修改和查询数据库,支持多种主流数据库系统,如Oracle、MySQL、SQL Server等。同时,它还可以生成数据库模型图,帮助开发者直观理解数据结构...

    Java个人实习总结.pdf

    1. Java基础知识回顾:在实习期间,实习生可能重温了Java的基础语法、面向对象的编程原则、数据类型、控制结构、异常处理等,这些都是Java编程的根基。 2. 集成开发环境(IDE)的使用:在实习中,实习生需要熟悉并...

    软件工程的实习报告4篇.pdf

    - 实习期间,学生重温了JAVA基础,Web设计,ORACLE数据库等关键技能。 - 强调了基础学习的重要性,特别是对于软件工程师而言,JAVA是必备技能。 - 学习了Web开发技术,理解了HTTP协议在B/S架构中的应用,掌握了...

    delphi4.0 开发工具包

    《Delphi 4.0 开发工具包:重温经典编程之旅》 Delphi 4.0,这款在1998年推出的开发工具,虽然已历经二十多年的岁月洗礼,但其影响力仍然不减,尤其在程序员社区中,仍有一部分忠实用户对它保持着深深的热爱。...

    电脑用JAVA模拟器.rar

    “JAVA”是Java编程语言的缩写,由Sun Microsystems(现已被Oracle公司收购)开发,是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的特性而著名。Java模拟器就是利用了这一特性,使得基于Java的...

Global site tag (gtag.js) - Google Analytics