码迷,mamicode.com
首页 > 数据库 > 详细

oracle 触发器

时间:2016-06-28 23:48:14      阅读:467      评论:0      收藏:0      [点我收藏+]

标签:

触发器
--启动触发器
alter trigger schema_trigger enable;
--禁用触发器
alter trigger schema_trigger disable;
--删除触发器
DROP TRIGGER COMPONT_GIS_TEM;

这个触发器是为了增加部件时,同步更新部件的缓存表,缓存表是为了在拿gis数据时,不用再联表查询街道、社区、大类的名称了
缓存表中的sequence是  COMPONT_GIS_TEM_SEQ
加入触发器的语句是
CREATE OR REPLACE TRIGGER COMPONT_GIS_TEM
AFTER INSERT
ON COMPONT_BJ
FOR EACH ROW
BEGIN    
        INSERT INTO COMPONT_BJ_GIS(NEWID,OBJCODE,OBJNAME,DEPTNAME,OBJPOS,OBJSTATE,OBJUSESTAT,POINT_X,POINT_Y,STCODE,BJTYPE,DALEI,ICON,AREACLASS,COMMCODE,BGZT,DEPTNAME2,DEPTNAME3,STREETNAME,COMMNAME,DALEINAME,LOCATION)VALUES(COMPONT_GIS_TEM_SEQ.nextval,:NEW.OBJCODE,:NEW.OBJNAME,:NEW.DEPTNAME,:NEW.OBJPOS,:NEW.OBJSTATE,:NEW.OBJUSESTAT,:NEW.POINT_X,:NEW.POINT_Y,:NEW.STCODE,:NEW.BJTYPE,:NEW.DALEI,:NEW.ICON,:NEW.AREACLASS,:NEW.COMMCODE,:NEW.BGZT,:NEW.DEPTNAME2,:NEW.DEPTNAME3,
(SELECT STREETNAME  FROM HOUSE_CONFIG_STREET WHERE STREETCODE = :NEW.STCODE),
(SELECT COMMNAME  FROM HOUSE_CONFIG_COMMUNITY1 WHERE COMMCODE = :NEW.COMMCODE),
(SELECT TYPENAME  FROM COMPONT_DALEINAME  WHERE ID = :NEW.DALEI),SDO_GEOMETRY(2001,8307,SDO_POINT_TYPE(:NEW.POINT_X,:NEW.POINT_Y,NULL),NULL,NULL));
end;



创建触发器的语法
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;



BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器。

       FOR EACH ROW选项说明触发器为行触发器。行触发器和语句触发器的区别表现在:行触发器要求当一个DML语句操作影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则只能为行触发器。

           REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。

WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER 行触发器中,不能用在INSTEAD OF 行触发器和其它类型的触发器中。

    当一个基表被修改( INSERT, UPDATE, DELETE)时要执行的存储过程,执行时根据其所依附的基表改动而自动触发,因此与应用程序无关,用数据库触发器可以保证数据的一致性和完整性。

 

每张表最多可建立12 种类型的触发器,它们是:

BEFORE INSERT

BEFORE INSERT FOR EACH ROW

AFTER INSERT

AFTER INSERT FOR EACH ROW

 

BEFORE UPDATE

BEFORE UPDATE FOR EACH ROW

AFTER UPDATE

AFTER UPDATE FOR EACH ROW

 

BEFORE DELETE

BEFORE DELETE FOR EACH ROW

AFTER DELETE

AFTER DELETE FOR EACH ROW



触发器触发次序

1.       执行 BEFORE语句级触发器;

2.       对与受语句影响的每一行:

l         执行 BEFORE行级触发器

l         执行 DML语句

l         执行 AFTER行级触发器

3.       执行 AFTER语句级触发器


 

例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。

 

CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2;
CREATE OR REPLACE TRIGGER tr_del_emp
   BEFORE DELETE --指定触发时机为删除操作前触发
   ON scott.emp
   FOR EACH ROW   --说明创建的是行级触发器
BEGIN
   --将修改前数据插入到日志记录表 del_emp ,以供监督使用。
   INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )
       VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate );
END;
DELETE emp WHERE empno=7788;
DROP TABLE emp_his;
DROP TRIGGER del_emp;
可以参考网址
http://blog.csdn.net/indexman/article/details/8023740/

oracle 触发器

标签:

原文地址:http://www.cnblogs.com/yuanfuqiang/p/5625220.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!