oracle触发器的使用

1,触发器简介
触发器(Trigger)是数据库对象的一种,编码方式类似存储过程,与某张表(Table)相关联,当有DML语句对表进行操作时,可以引起触发器的执行,达到对插入记录一致性,正确性和规范性控制的目的。在当年C/S时代盛行的时候,由于客户端直接连接数据库,能保证数据库一致性的只有数据库本身,此时主键(Primary Key),外键(Foreign Key),约束(Constraint)和触发器成为必要的控制机制。而触发器的实现比较灵活,可编程性强,自然成为了最流行的控制机制。到了B/S时代,发展成4层架构,客户端不再能直接访问数据库,只有中间件才可以访问数据库。要控制数据库的一致性,既可以在中间件里控制,也可以在数据库端控制。很多的青睐Java的开发者,随之将数据库当成一个黑盒,把大多数的数据控制工作放在了Servlet中执行。这样做,不需要了解太多的数据库知识,也减少了数据库编程的复杂性,但同时增加了Servlet编程的工作量。从架构设计来看,中间件的功能是检查业务正确性和执行业务逻辑,如果把数据的一致性检查放到中间件去做,需要在所有涉及到数据写入的地方进行数据一致性检查。由于数据库访问相对于中间件来说是远程调用,要编写统一的数据一致性检查代码并非易事,一般采用在多个地方的增加类似的检查步骤。一旦一致性检查过程发生调整,势必导致多个地方的修改,不仅增加工作量,而且无法保证每个检查步骤的正确性。触发器的应用,应该放在关键的,多方发起的,高频访问的数据表上,过多使用触发器,会增加数据库负担,降低数据库性能。而放弃使用触发器,则会导致系统架构设计上的问题,影响系统的稳定性。

 

2,触发器语法和功能
触发器的语法如下
CREATE OR REPLACE TRIGGER trigger_name
<before | after | instead of> <insert | update | delete> ONtable_name
[FOR EACH ROW]
WHEN (condition)
DECLARE
BEGIN
--
触发器代码
END;

 

3:简单实例(行级触发器之一)

下面我们可以用oraclce中scott用户下的salary表作实例

 目标:我们往emp表中做insert操作之后通过触发器来简单的打印一句话,

    先创建触发器:

     create or replace trigger trigger_test --定义类对象[trigger],定义对象名称[trigger_test]

      after insert on emp --触发时间[after] ,DML语言

       for each  row  --逐行监测[意思就是每插入一行则进行下面的输出]

       declare

       begin

           dbms_output.put_line('插入emp表之后打印此信息'); --触发器操作内容

           dbms_output.put_line('触发器执行完毕.......');

       end;

    其次:

        在plSQL中新开一个sql window  执行以下操作

         
          insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
                        values (7369, 'SMITH', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800.00, null, 20);

    执行完之后再打开output标签页面

     结果显示:

                   插入emp表之后打印此信息'

                   触发器执行完毕.......

4:行级触发器之二

     此时有人可能会问语法中的WHEN (condition)啥时候用上啊, 所以下面给大家解释一下.

     WHEN后跟的condition是触发器的响应条件,只对行级触发器有效,当操作的记录满足condition时,

     触发器才被 执行,否则不执行。

   实例二:

 

     
create or replace trigger tri_test2
AFTER INSERT OR UPDATE of sal  ON  g_test
 for each row
   when (new.sal >1000 and (old.sal is null or old.sal <500))
     declare
      v_maxsalary  number;
      begin
        select sal into v_maxsalary
        from employment where EMPLOYEE_ID =: new.id;
        if:new.sal > v_maxsalary then
         dbms_output.put_line('你好!');
        end if
      end;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值