Oracle 之 触发器

  触发器是特定的事件出现的时候,自动隐式执行代码块,这个过程用户无法控制,用户只能控制触发的事件,触发后的操作,触发过程是自动执行的。

定义触发器:

  1、名称

  2、触发时间:是在执行事件之前(before)触发,还是之后(after)触发

  3、事件:insert(插入)、delete(删除)、update(更新)

  4、作用目标:on table_name

  5、引用的值:old(旧值)、new(新值)

  6、作用域:for each row(行级)或 无此行表示语句级

  7、约束条件:可选,where 约束条件,不能包含查询语句,也不能调用PL/SQL函数

  8、主体语句:begin ...

  示例:create or replace trigger biufer_employess_emp_id

       before insert or update of emp_id on employees

      referencing old as old_value new as new_value

      for each row

      when (new_value.emp_id =9)

      begin

       :new_value.age :=26;

     end biufer_employess_emp_id;

   当执行下面SQL语句时触发器被触发:

   INSERT INTO employees(emp_id,emp_name,position,age,address)
         VALUES(9,‘周迅‘,‘开发工程师‘,NULL,‘南京路99号‘);

   触发器自动执行,不会通知用户,再次查看employees表时:

    9 周迅 开发工程师 26 南京路99号

   但此时触发器不会提交,触发器里也不能使用commit/rollback/DDL语句,只能由用户提交(或其他程序)

触发器类型

 1、语句触发器

  在表上或者某些情况下的视图上执行的特定语句或者语句组的触发器。能够与insert、delete、update或者组合上进行关联。但无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。

  示例:需要对表进行DML的用户进行安全检查,看是否具有合适的特权。

  create table foo(a number);

  create trigger biud_foo

   before insert or update or delete on foo

   begin

    if user not in (‘donny‘) then

    raise_application_error(-20001,‘You don"t have access to modify this table. ‘);

    end if;

   end;  //即使sys,system用户也不能修改foo表

 2、行触发器

  是指为受到影响的各个行激活的触发器。

  示例:为主键生成自增序列号

  create table foo(id number,data varchar2(20));

  create sequence foo_seq;

  create or replace trigger bifer_foo_pk

  before insert on foo

  for eache row

  begin

   select foo_seq.nextval into :new.id from dual;

  end

  SQL语句

  insert into foo(data) values(‘donny‘);//自动添加id值

  insert into foo values(5,‘chen‘);  //插入该行5会被替换成foo_seq.nextval生成的值

  select *from foo;

 3、instead of 触发器

  create or replace view company_name as select emp_id,emp_name,position,age,address from scctt.employess;

  update company_name set emp_name = ‘tom‘ where emp_id = 13;

  create or replace trigger update_name_company_name

    instead of update on company_name

  begin

    update employess set emp_id := :new.emp_id,

    emp_name := :new.emp_name,

    where employess_id = :old.emp_id;

  end;  

 4、系统条件触发器

  系统事件:数据库启动、关闭,服务器错误

  create trigger ad_startup  after startup on database

  begin

  ---do some stuff

  end;

 5、用户事件触发器 

  用户事件:用户登录、注销,create/alter/drop/analyze/audit/grant/revoke/rename/trancate/logoff

   示例:记录删除对象

  create table drop_object(obj_name varchar2(30),obj_type varchar2(30),dropped_on date);  //日志表

  create or replace trigger log_drop_trigger  // 触发器

  before drop on donny.schema

  begin

  insert into drop_object values(ora_dict_obj_name,ora_dict_type,sysdate);

  end;

  SQL语句:

  create table drop_me(a number);

  create view drop_me_view as select *from drop_me;

  drop view drop_me_view;

  drop table drop_me;

  select *from droped_objects

  禁用和启用触发器 
    alter trigger <trigger_name> disable; 
    alter trigger <trigger_name> enable;

  触发器的作用

    1、允许/限制对表的修改

    2、自动生成派生列,比如自增字段。

    3、强制数据一致性。

    4、提供审计和日志记录

    5、防止无效的事务处理

    6、启用复杂的业务逻辑

      

时间: 2024-10-27 03:09:59

Oracle 之 触发器的相关文章

Oracle数据库——触发器的创建与应用

一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数据库后才能向该表中执行DML操作.(第1题中,user是系统函数,返回当前用户.字符串中使用两个单引号表示一个单引号.) 要求:分别以system用户和scott用户对emp 表执行DML操作,试验触发器的运行效果. (1)在scott用户下创建触发器 语句: create or replace t

Oracle的触发器

过去做项目. 都是前端后台的编码.由于数据库都让项目经理给写好的.自己对于数据库并没有多少优化,时间久了,反而把数据库的知识给淡忘了,近期的项目用到的是Oracle数据库,大家都知道.用到这个数据库.就是数据量比較大的项目了.对于优化就有必要了.因此自己下班后抽出时间复习一下,并把这个记录下来,不仅仅是分享给大家,还能以后自己再次复习.若我讲得不正确,请留言更正,本人会虚心接受并改更,这样才干进步. 1.什么是触发器 每当一个特定的数操作语句(insert,update,delete)在指定的表

ORACLE 11G 触发器调试记录Error: PLS-00201: identifier&#39;SYS.DBMS_SYSTEM&#39; must be declared

1,触发器内容如下 CREATE OR REPLACE TRIGGER"LOGON_DENIED_TO_ALERT" AFTER servererror ON DATABASE DECLARE message   VARCHAR2(168); ip        VARCHAR2(15); v_os_user VARCHAR2(80); v_module  VARCHAR2(50); v_action  VARCHAR2(50); v_pid     VARCHAR2(10); v_s

oracle中触发器的讲解

触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行.即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数.所以运行触发器就叫触发或点火(firing).ORACLE事件指的是对数据库的表进行的INSERT.UPDATE及DELETE操作或对视图进行类似的操作.ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等.所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,

Oracle中触发器(1)

Oracle数据库触发器是存储于数据库的命名PL/SQL语句块,当触发事件发生时他们会隐含的执行,执行触发器的活动被称为触发触发器. 特定用户在特定模式下,或者任何用户执行的ddl语句(如create或者alter),这种触发器经常被用于审计目的,并且专用于oracle DBA.可以记录各种模式修改,何时执行.以及那个用户执行的. 系统事件,如数据库启动或者关闭 用户事件,如登录或者注销.即可以定义一个触发器,在用户登录数据库时记录用户名和登录时间. 触发器相关视图: 创建触发器的通用语法: c

oracle 中触发器增加存储过程commit问题

触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了 当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务里的子事务 正常情况下,Oracle规定在触发器中不能运行 ddl语句和commit,rollback语句. 解决办法有两种: 1.在可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理.如: create or replace trigger UPDA

oracle利用触发器实现自增列

oracle没有自增列功能,mysql 和 sqlserver 分别用auto_increment和identity(1,1)来实现自增.oracle要实现只能通过序列实现,每次插入的时候通过取序列的值显示的给自增列,感觉有些不方便,这里使用触发器来代替,从而使插入的时候三者数据库在语法上一致,便于DAO代码的移植.下面是ORACLE实现示例,步骤如下:                                                                        

Oracle使用触发器和mysql中使用触发器的比较——学习笔记

一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志,自动通知好友,其实就是在增加日志的时候做一个出发,再向表中写入条目. --触发器的效率很高 举例:论坛的发帖,每插入一个帖子都希望将版面表中的最后发帖时间,帖子总数字段进行同步更新,这时使用触发器效率会很高. 二.Oracle 使用 PL/SQL 编写触发器 1.--PL/SQL创建触发器的一般语法

MYSQL和ORACLE的触发器与存储过程语法差异

整改了一番脚本,遇到了一些两种数据库之间的差异,记录一下: 触发器: 差异 MYSQL ORACLE 说明 创建语句不同 create trigger `AA` BEFORE INSERT on `BB` for each row  create or replace trigger AA  before insert or update or delete on BB  for each row 1.Oracle可以在一个触发器触发insert,delete,update事件.    Mysq

ORACLE数据库触发器【转载】

ORACLE 触发器其实是PL/SQL块,它类似于存储过程和函数,不过有一点不同的是,触发器是隐式调用的,并不能接收参数.    ORACLE触发器有三种类型,分别是:DML触发器, 替代触发器和系统触发器. 下面对这三种类型一一进行讲述 1.DML触发器 顾名思义,DML触发器是由DML语句触发的.例如数据库的INSERT/UPDATE/DELETE操作都可以触发该类型的触发器. 它们可以在这些语句之前或之后触发,或者在行级上触发(就是说对于每个受影响的行都触发一次) 例如我们有一张表TABL