您好,UncleToo欢迎您!  为了更好的浏览本站,请使用高版本浏览器
RSS  Tag     设为首页 | 加入收藏
 您所在的位置:首页 > 数据库技术 > Oracle

小心Oracle触发器创建的陷阱

作者:未知  来源:互联网  日期:2015-01-30 22:12:11
收藏  评论:( 0 )  阅读:386

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",因为有些工具删除或编译这样的触发器时会报错,到时只能用命令来操作,相当麻烦.




除非特别声明,本站所有PHP教程及其他教程/文章均为原创、翻译或网友投稿,版权均归UncleToo中文网所有, 转载请注明作者及出处。
原文网址:http://www.uncletoo.com/html/oracle/1107.html
读完这篇文章后,你是否有所收获? 分享是一种生活的信念!
  • 0
  • 0
我来说两句
更多>>网友评论