觸發器的不知名錯誤

xuyongjun5124020 2012-04-19 12:18:23
各位大哥,今天小弟寫了一個觸發器,實現兩個表的聯級更新,一個表為student(id,name,address,sal),另一個表為class(id,name,classroom)。兩表的id和name的數據類型一樣,但兩表之間并沒有添加約束。觸發器的源代碼如下:
create or replace trigger modify_together
before update of name
on student
for each row
begin
dbms_output.put_line('old name is :' || :old.name);
dbms_output.put_line('new name is :' || :new.name);
update class set name = :new.name where name = :old.name;
end;
/
當執行完這段代碼之前,系統提示觸發器已成功創建。于是小弟再執行一條更新語句:
update student set name ='vinda' where id =7;
但此時系統卻提示錯誤,錯誤信息如下:
第1行出現錯誤:
ORA-04098:觸發器'SYSTEM.MODIFY_STUDENT'無效且未通過重新驗證
...全文
132 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xu176032 2012-04-23
  • 打赏
  • 举报
回复
话说我似乎也遇到过这种情况....

在你那个触发器创建之前用一个conn ,就OK了
SQL> conn sql/hello
Connected to Oracle Database 10g Express Edition Release 10.2.0.1.0
Connected as sql

SQL>
SQL> create or replace trigger trigger_2 before insert on test_2 for each row
2 DECLARE
3 PRAGMA AUTONOMOUS_TRANSACTION;
4
5 begin
6 insert into test_1 values(:new.id,:new.name);
7 :new.name :=to_char(sysdate,'YYYY-MM-DD HH24:MI:SS');
8 commit;
9 end;
10
11 /

Trigger created

然后再在这个用户下使用就没问题了
ssqtjffcu 2012-04-20
  • 打赏
  • 举报
回复
明明报的是MODIFY_STUDENT触发器的错,你找modify_together干吗?
light5820756 2012-04-20
  • 打赏
  • 举报
回复
create or replace trigger modify_together
before update of name
on student
for each row
begin
dbms_output.put_line('old name is :' || :old.name);
dbms_output.put_line('new name is :' || :new.name);
update class set name = :new.name where name = :old.name;
--end;
end modify_together;
是不是end后面需要+ modify_together;
xuyongjun5124020 2012-04-20
  • 打赏
  • 举报
回复
MODIFY_STUDENT这个触发器已經是成功創建了,但問題還是存在,我用另外一個用戶做這個應用也是一樣的。
ssqtjffcu 2012-04-19
  • 打赏
  • 举报
回复
检查一下是不是有MODIFY_STUDENT这个触发器,看这个触发器是不是有问题。
「已注销」 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

1,after update才有new.name
2,class里的name不一定就等于old.name
[/Quote]
不好意思,弄错了,谢谢二楼批评指正,虚心接受
forgetsam 2012-04-19
  • 打赏
  • 举报
回复
"SYSTEM.MODIFY_STUDENT"

你的表在谁的名下?哪有在system用户下做应用的?
forgetsam 2012-04-19
  • 打赏
  • 举报
回复

1,after update才有new.name
-- 胡扯
2,class里的name不一定就等于old.name
-- 没有也不会报错,最多是删除0条数据
「已注销」 2012-04-19
  • 打赏
  • 举报
回复
1,after update才有new.name
2,class里的name不一定就等于old.name

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧