本帖最后由 love840829 于 2012-12-12 14:52:46 编辑

解决方案 »

  1.   


    create  trigger tr_insert
      after insert or update on table_name
    for each row
    begin
    when inserting or updating then
    :new.columns_name=lower(:new.columns_name);
    end;
      

  2.   

    这样create or replace trigger tr_emp
    after insert or update on emp
    declare
    begin
    if inserting then update emp set ename=lower(ename); 
    end if;
    end;
      

  3.   

    create  trigger tr_insert
      after insert or update on table_name
    for each row
    begin
    when inserting or updating then
    :new.columns_name:=lower(:new.columns_name);
    end;
      

  4.   

    事实说话吧 
    你的已用时间:  00: 00: 00.00
    16:38:13 SCOTT@orcl> ed
    已写入 file afiedt.buf  1  create  trigger tr_insert
      2    after insert or update on scott.emp
      3  for each row
      4  begin
      5  if inserting or updating then
      6  :new.ename:=lower(:new.ename);
      7  end if;
      8* end;
    16:38:39 SCOTT@orcl> /
    create  trigger tr_insert
                    *
    第 1 行出现错误:
    ORA-04084: 无法更改此触发器类型的 NEW 值
    我的16:38:41 SCOTT@orcl> ed
    已写入 file afiedt.buf  1  create or replace trigger tr_emp
      2  after insert or update on scott.emp
      3  declare
      4  begin
      5  if inserting then update emp set ename=lower(ename);
      6  end if;
      7* end;
    16:39:33 SCOTT@orcl> /触发器已创建
    16:40:15 SCOTT@orcl> select ename from emp;ENAME
    ----------
    G001
    GWMK
    W002
    W001
    G002
    1002
    1002
    TEST110
    TEST111
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    JAMES
    FORD
    MILLER已选择23行。16:40:19 SCOTT@orcl> insert into emp(empno,sal) values(1214,1212);已创建 1 行。已用时间:  00: 00: 00.01
    16:41:21 SCOTT@orcl> commit;提交完成。已用时间:  00: 00: 00.01
    16:41:26 SCOTT@orcl> select ename from emp;ENAME
    ----------
    <null>
    g001
    gwmk
    w002
    w001
    g002
    1002
    1002
    test110
    test111
    smith
    allen
    ward
    jones
    martin
    blake
    clark
    scott
    king
    turner
    adams
    james
    ford
    miller已选择24行。已用时间:  00: 00: 00.03
      

  5.   


    非得这么较真弟弟 
    完整的编译通过的代码:create or replace trigger tr_emp
        before insert or update on scott.emp
        for each row
        begin
        if inserting or updating then
        :new.ename:=lower(:new.ename);
        end if;
       end;
    你的代码,触发器会被调用两次,insert触发一次 调用update
    update 再次触发一次
    这样存在安全隐患,隐患的程度取决于你updating的处理情况。
      

  6.   


    不是较真,是因为没见过after触发里还能修改:new值的
    我的我知道update处理的话会造成死循环,所以没处理update的如果用before 那就好办了嘛
      

  7.   

    行级Before触发器才能修改:NEW值,而行级after触发器不行