首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

一个容易的触发器报错

2013-03-01 
一个简单的触发器报错create or replace trigger changetwoafter UPDATE OF tnameON system.teachersfor E

一个简单的触发器报错
create or replace trigger changetwo
  after UPDATE OF tname
    ON system.teachers
  for EACH ROW
BEGIN
  DBMS_OUTPUT.PUT_LINE('The old value is:' || :OLD.TNAME ||
                       'The new one is:' || :NEW.TNAME);
  UPDATE EM.ORA_TEST_TWO
     SET EM.ORA_TEST_TWO.NAME = :NEW.TNAME
   WHERE EM.ORA_TEST_TWO.ID = SYSTEM.TEACHERS.TID;
END CHANGETWO;
如果主表中的tname更改,就触发ora_test_two中id和tid关联对应的name.报两个错:
一个是说system.teachers.tid标识符无效,另一个是update那条语句statement ignored。请指教。
Error: PL/SQL: ORA-00904: "SYSTEM"."TEACHERS"."TID": 标识符无效
Line: 10
Text: WHERE EM.ORA_TEST_TWO.ID = SYSTEM.TEACHERS.TID;
Error: PL/SQL: SQL Statement ignored
Line: 8
Text: UPDATE EM.ORA_TEST_TWO


[解决办法]
你这个触发器是建在那个表空间上的 ?
EM 有没有建dblink ?
这个用户有没有读取system 表空间的权限?
[解决办法]
我认为是权限的问题,em用户的权限是读取任何的表,但并不代表em用户可以在任何表上建触发器。建议你先用SYSTEM用户登陆下,然后把表TEACHERS的所有权限授予用户em。然后再看看触发器是否可用
[解决办法]

create or replace trigger changetwo
  after UPDATE OF tname ON system.teachers
  for EACH ROW
BEGIN
  DBMS_OUTPUT.PUT_LINE('The old value is:' 
[解决办法]
 :OLD.TNAME 
[解决办法]

                       'The new one is:' 
[解决办法]
 :NEW.TNAME);
  UPDATE EM.ORA_TEST_TWO
     SET EM.ORA_TEST_TWO.NAME = :NEW.TNAME
   WHERE EM.ORA_TEST_TWO.ID = :NEW.TID;  --改成:new试试
END CHANGETWO;

热点排行
Bad Request.