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

解决方案 »

  1.   

    你这个触发器是建在那个表空间上的 ?
    EM 有没有建dblink ?
    这个用户有没有读取system 表空间的权限?
      

  2.   

    触发器是建立在默认表空间上的,没有dblink,em用户的权限是读取任何的表。
      

  3.   

    我认为是权限的问题,em用户的权限是读取任何的表,但并不代表em用户可以在任何表上建触发器。建议你先用SYSTEM用户登陆下,然后把表TEACHERS的所有权限授予用户em。然后再看看触发器是否可用
      

  4.   

    em有建立触发器的权限,不是建立在em用户下吗?em有权限对表teachers作任何操作。对权限这不是很懂,回去仔细研究一下再请教。
      

  5.   

    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;