码迷,mamicode.com
首页 > 其他好文 > 详细

关于触发器创建的陷阱

时间:2015-01-30 16:01:31      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

Oracle触发器的创建和存储过程、函数、包等的创建有点区别,应当注意.

陷阱一:

当前schema与触发器拥有者不一致

例如:

当前登录的schema为R5_T150,然后执行下面的创建触发器:

create or replace trigger "R5_T135".TRI_forbidden_01
  before update or delete of GOODSCODE on t_goods
begin
        RAISE_APPLICATION_ERROR(-20002, 'forbidden operations!');
end TRI_forbidden_01;

如果是存储过程、函数,这样创建是没有问题的,但触发器不一样,为什么?

注意触发器是可以跨schema的(系统级触发器).所以上面的代码最终创建的触发器应会是属于R5_T135(它是DBA角色)这个schema,但所触发的表却是R5_T150的.

这样就会在PL/SQL DEV工具里出现一个奇怪的现象,在当前SCHEMA下,查看表上的触发器会发现有"R5_T135".TRI_FORBIDDEN_01,但去查看当前SCHEMA所有的触发器却找不到它.


陷阱二:

如果我们使用PL/SQL DEV中的sql Window来创建触发器(或将下面的代码使用sqlplus脚本来创建):

create or replace trigger  TRI_forbidden_01
  before update or delete of GOODSCODE on t_goods
begin
        RAISE_APPLICATION_ERROR(-20002, 'forbidden operations!');
end TRI_forbidden_01;

alter trigger TRI_forbidden_01 enable;

这样创建的触发器将显示为编译无效的状态,查看其源码,发现最后一句alter trigger TRI_forbidden_01 enable;也会在触发器的源码之中.


最后:特别注意不要创建类似这样命名的触发器"TRI_aaBB","TrI_Test",因为有些工具删除或编译这样的触发器时会报错,到时只能用命令来操作,相当麻烦.

关于触发器创建的陷阱

标签:

原文地址:http://blog.csdn.net/edcvf3/article/details/43305881

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