create table test(name varchar2(60),id number null);
create table test1(name varchar2(60),id number null,tel number null);我想创建一个触发器,当删除test表中记录时,调用触发器来删除test1表中具有相同id的记录,
下面sql语句创建触发器有什么问题?为什么创建不成功?(环境oracle 9i)
CREATE or replace trigger test_trigger before delete on test
begin
 delete from test1 where deleted.id =id;
end;

解决方案 »

  1.   

    delete from test1 where deleted.id =id;
    改为
    delete from test1 where deleted.id =:old.id;
      

  2.   

    CREATE or replace trigger test_trigger before delete on test
    begin
     delete from test1 where deleted.id =:ole.id;
    end;好像把or replace 可以去掉
      

  3.   

    CREATE or replace trigger test_trigger 
      before delete on test
      for each row --行级触发
    begin
     delete from test1 where test1.id =:old.id;
    end;不要把SQLServer与Oracle搞混了
      

  4.   

    行级和语句级触发器 
    触发器声明为行级触发器(此情况下,它在每行修改之前或之后执行)或语句级触发器(此情况下,它在整个触发器语句完成后执行)。可以定义行级触发器在插入、更新或删除之前 (BEFORE) 或之后 (AFTER) 执行。语句级触发器在语句后 (AFTER) 执行。RESOLVE 触发器事件用于 SQL Remote:它仅在行级 UPDATE 或 UPDATE OF column-lists 之前触发。要将触发器声明为行级触发器,请使用 FOR EACH ROW 子句。要将触发器声明为语句级触发器,可以使用 FOR EACH STATEMENT 子句或忽略 FOR EACH 子句。为清楚起见,建议在声明语句级触发器时输入 FOR EACH STATEMENT 子句。
    好好看看基础 在ORACLE中没有DELETED这个关键字, 
      

  5.   

    语句级触发器不允许使用:NEW和:OLD,行级触发器允许
    :NEW和:OLD名称可以改,在触发器定义中
    REFERENCING OLD AS DELETED NEW AS INSERTED
    FOR EACH ROW
    但,还是得在前面加冒号: