CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  开发

高手帮忙:为什么创建触发器是会报错:ORA-04098: 触发器 'DB0.SS' 无效且未通过重新确认,

楼主naodex(心动)2003-11-01 20:27:44 在 Oracle / 开发 提问

为什么创建触发器是会报错:  
  ORA-04098:   触发器   'DB0.SS'   无效且未通过重新确认 问题点数:0、回复次数:18Top

1 楼jiezhi(风满袖)回复于 2003-11-01 20:38:11 得分 0

代碼有錯Top

2 楼naodex(心动)回复于 2003-11-02 17:07:33 得分 0

帮忙看看下面的代码有什么错?谢谢!给分!  
   
  CREATE   OR   REPLACE   TRIGGER   DBO.AA  
  AFTER     DELETE    
  ON   DBO.AA  
  FOR   EACH   ROW    
  begin  
        insert   into   AA_BAK   values(:old.aa1,:old.aa2);  
  end;Top

3 楼beckhambobo(beckham)回复于 2003-11-02 18:38:43 得分 0

当然有错,触发器名字与表名相同Top

4 楼naodex(心动)回复于 2003-11-02 18:55:13 得分 0

不行啊,楼上  
  我改了触发器名字,还是不行呀,用SQLPLUS创建警告有编译错误Top

5 楼wupangzi(无本之木)回复于 2003-11-02 19:10:00 得分 0

CREATE   OR   REPLACE   TRIGGER   DBO.AA--修改触发器名  
  AFTER     DELETE    
  ON   DBO.AA  
  FOR   EACH   ROW    
  begin  
        insert   into   AA_BAK   values(:old.aa1,:old.aa2);--指明要插入字段  
  end;  
  Top

6 楼naodex(心动)回复于 2003-11-02 19:24:35 得分 0

创建成功,但是删除数据时报错!  
  ORA-04098:   触发器   'GJPT.TRI_AA'   无效且未通过重新确认Top

7 楼wupangzi(无本之木)回复于 2003-11-02 19:45:53 得分 0

你建立后提交了吗?  
  commit;Top

8 楼naodex(心动)回复于 2003-11-03 08:58:44 得分 0

SQL>   CREATE   OR   REPLACE   TRIGGER   gjpt.TRI_AA  
      2     AFTER     DELETE  
      3     ON   gjpt.AA  
      4     FOR   EACH   ROW  
      5     begin  
      6           insert   into   AA_BAK   (a1)   values(:old.a1);  
      7     end   gjpt.TRI_AA;  
      8     /  
   
  警告:   创建的触发器带有编译错误。  
   
  SQL>   select   *   from   aa;  
   
  A1  
  --------------------  
  3  
  2  
  1  
   
  SQL>   select   *   from   aa_bak;  
   
  未选定行  
   
  SQL>   delete   from   aa;  
  delete   from   aa  
                          *  
  ERROR   位于第   1   行:  
  ORA-04098:   触发器   'GJPT.TRI_AA'   无效且未通过重新确认  
   
  这是我的操作过程,大家看看吧!写了!一定给分!  
  Top

9 楼wupangzi(无本之木)回复于 2003-11-04 20:10:54 得分 0

SQLWKS>   create   table   aa(  
            2>   wgtest1   varchar2(12),  
            3>   wgtest2   varchar2(32)  
            4>   );  
  语句已处理。  
  SQLWKS>   commit;  
  语句已处理。  
  SQLWKS>   CREATE   OR   REPLACE   TRIGGER   trig_aa  
            2>   AFTER     DELETE  
            3>   ON   aa  
            4>   FOR   EACH   ROW  
            5>   begin  
            6>           insert   into   aa(wgtest1,wgtest2)   values(:old.wgtest1,:old.wgtest2);  
            7>   end;  
            8>    
  语句已处理。  
  SQLWKS>   commit;  
  语句已处理。  
  SQLWKS>   select   *   from   aa;  
  WGTEST1             WGTEST2                                                    
  ------------   --------------------------------  
  已选择0行。  
  SQLWKS>   delete   from   aa;  
  己处理0行。  
   
  其实你要注意的是,你对同一个表操作,你的表如果有结果你将看到:  
  SQLWKS>   insert   into   aa   values('aa','bb');  
  处理了   1   行。  
  SQLWKS>   commit;  
  语句已处理。  
  SQLWKS>   delete     from   aa;  
  ORA-04091:   表JXYS.AA发生了变化,触发器/函数不能读  
  ORA-06512:   在"JXYS.TRIG_AA",   line   2  
  ORA-04088:   触发器'JXYS.TRIG_AA'执行过程中出错Top

10 楼wupangzi(无本之木)回复于 2003-11-04 20:14:33 得分 0

当我们用另外的触发器就可以看到:  
  SQLWKS>   CREATE   OR   REPLACE   TRIGGER   trig_aa  
            2>   AFTER     DELETE  
            3>   ON   aa  
            4>   FOR   EACH   ROW  
            5>   begin  
            6>   insert   into   bb(wgbbtest1,wgbbtest2)   values(:old.wgtest1,:old.wgtest2);  
            7>   end;  
            8>    
  语句已处理。  
  SQLWKS>   commit;  
  语句已处理。  
  SQLWKS>   delete   from   aa;  
  处理了   1   行。  
  SQLWKS>   select   *   from   bb;  
  WGBBTEST1         WGBBTEST2                                                
  ------------   --------------------------------  
  aa                       bb                                                              
  已选择   1   行。  
  我们的结果表bb中已经有数据了!Top

11 楼lrchen(derek)回复于 2003-11-28 13:25:14 得分 0

老大,你的问题解决了么,我也碰到同样的问题,你是如何解决的,给我回一帖阿!Top

12 楼xinpingf(白开心)回复于 2003-11-28 13:30:24 得分 0

应该用BEFORE   DELETE吧?  
   
  Top

13 楼xinpingf(白开心)回复于 2003-11-28 13:37:24 得分 0

SQL>   CREATE   OR   REPLACE   TRIGGER   gjpt.TRI_AA  
      2     AFTER     DELETE  
      3     ON   gjpt.AA  
      4     FOR   EACH   ROW  
      5     begin  
      6           insert   into   AA_BAK   (a1)   values(:old.a1);  
      7     end   gjpt.TRI_AA;  
      8     /  
   
  警告:   创建的触发器带有编译错误。  
   
  SQL>   select   *   from   aa;  
   
  A1  
  --------------------  
  3  
  2  
  1  
   
  SQL>   select   *   from   aa_bak;  
   
  未选定行  
   
  SQL>   delete   from   aa;  
  delete   from   aa  
                          *  
  ERROR   位于第   1   行:  
  ORA-04098:   触发器   'GJPT.TRI_AA'   无效且未通过重新确认  
   
  这是我的操作过程,大家看看吧!写了!一定给分!  
   
   
   
  这个在我这里执行没有任何错误出现  
   
  我觉得问题处在:  
  1、当前的用户是不是gjpt  
  2、当前用户的权限?  
   
  你在创建完TRIGGER出错后,应该用SHOW   ERROR显示一下错误信息,这样才能帮你分析原因Top

14 楼xinpingf(白开心)回复于 2003-11-28 13:38:47 得分 0

另:显示一下AA_BAK的表结构~Top

15 楼wwl007(疑难杂症)回复于 2003-11-28 17:00:51 得分 0

After   好像不支持   行级触发器   所以应该使用   Befor   级触发器Top

16 楼ydfok(发芽的石头)回复于 2003-11-29 00:56:53 得分 0

关注中。。。Top

17 楼beckhambobo(beckham)回复于 2003-11-30 18:33:18 得分 0

在行级别后delete触发器,可能:old为null了,可以测试一下:  
  create   trigger   a_tri  
  after   delete   on   a  
  for   each   row  
  begin  
  if   :old.id   is   null   then  
  insert   into   b   values('1');  
  end   if;  
  end;  
  /  
  这样查看b表中是否存在1的值,就知道事实  
  建义把after改成beforeTop

18 楼gegangqiao(困惑的男人)回复于 2003-12-01 23:09:58 得分 0

下面的这一句不要  
   
  FOR   EACH   ROWTop

相关问题

  • 触发器insert事件报错
  • 为何触发器有时报错,有时不报错?很急,谢谢!
  • 各位老大我在oracle817里创建触发器:报错:无效的触发器类型!
  • 初学触发器,建了一个简单的触发器都报错,郁闷中。
  • 我的触发器 报错:列前缀"inserted" 与查询中所用的表别名或别名不匹配
  • 一个很简单的触发器莫名报错,帮忙看看到底为什么
  • 触发器?!
  • 触发器
  • 触发器
  • 求触发器

关键词

  • 语句
  • 编译
  • 触发器
  • gjpt
  • wgtest
  • aa
  • sqlwks
  • wgbbtest
  • 创建
  • old

得分解答快速导航

  • 帖主:naodex

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo