日期:2014-05-17  浏览次数:20805 次

一个简单的触发器报错
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;