oracle触发器的问题,请教大家

时间:2021-08-06 10:57:46
请教一下大家,我想针对一张表建个触发器,在对表插入数据后,将某一个字段统一改为小写,这个触发器该怎么写啊?

我是这样写的,但是提示错误ora-04098 
create  trigger tr_insert
  after insert or update on table_name
begin
when insert or update then
update table_name set columns_name=lower(columns_name)
end;

14 个解决方案

#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


引用 1 楼 BenChiM888 的回复:
SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeginwhen inserting or updating then:new.columns_name=lower(:new.columns_name);end;



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


引用 3 楼 BenChiM888 的回复:
引用 1 楼 BenChiM888 的回复:SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeginwhen inserting or updating then:new.columns_name=lower(:new.columns_n……


你的触发器能编译通过?

#5


引用 4 楼 edcvf3 的回复:
引用 3 楼 BenChiM888 的回复:引用 1 楼 BenChiM888 的回复:SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeginwhen inserting or updating then:new.columns_nam……


领会精神,你写的是个死循环弟弟。

#6


引用 5 楼 BenChiM888 的回复:
引用 4 楼 edcvf3 的回复:
引用 3 楼 BenChiM888 的回复:引用 1 楼 BenChiM888 的回复:SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeginwhen inserting or updating then:new.colu……

事实说话吧 
你的

已用时间:  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

#7


我的是表级触发 你的是行级触发
我开始也准备像你那样做,可是编译通不过。

#8


引用 6 楼 edcvf3 的回复:
引用 5 楼 BenChiM888 的回复:引用 4 楼 edcvf3 的回复:
引用 3 楼 BenChiM888 的回复:引用 1 楼 BenChiM888 的回复:SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeginwhen ……


非得这么较真弟弟  oracle触发器的问题,请教大家
完整的编译通过的代码:

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的处理情况。

#9


引用 8 楼 BenChiM888 的回复:
引用 6 楼 edcvf3 的回复:
引用 5 楼 BenChiM888 的回复:引用 4 楼 edcvf3 的回复:
引用 3 楼 BenChiM888 的回复:引用 1 楼 BenChiM888 的回复:SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeg……

oracle触发器的问题,请教大家
不是较真,是因为没见过after触发里还能修改:new值的
我的我知道update处理的话会造成死循环,所以没处理update的

如果用before 那就好办了嘛

#10


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

#11


顶10楼的,之前触发

#12


菜鸟路过~~~~

#13


引用 1 楼 BenChiM888 的回复:
SQL code
?



12345678

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


这个正解

#14


引用 1 楼 BenChiM888 的回复:
SQL code
?



12345678

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

顶一个

#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


引用 1 楼 BenChiM888 的回复:
SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeginwhen inserting or updating then:new.columns_name=lower(:new.columns_name);end;



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


引用 3 楼 BenChiM888 的回复:
引用 1 楼 BenChiM888 的回复:SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeginwhen inserting or updating then:new.columns_name=lower(:new.columns_n……


你的触发器能编译通过?

#5


引用 4 楼 edcvf3 的回复:
引用 3 楼 BenChiM888 的回复:引用 1 楼 BenChiM888 的回复:SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeginwhen inserting or updating then:new.columns_nam……


领会精神,你写的是个死循环弟弟。

#6


引用 5 楼 BenChiM888 的回复:
引用 4 楼 edcvf3 的回复:
引用 3 楼 BenChiM888 的回复:引用 1 楼 BenChiM888 的回复:SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeginwhen inserting or updating then:new.colu……

事实说话吧 
你的

已用时间:  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

#7


我的是表级触发 你的是行级触发
我开始也准备像你那样做,可是编译通不过。

#8


引用 6 楼 edcvf3 的回复:
引用 5 楼 BenChiM888 的回复:引用 4 楼 edcvf3 的回复:
引用 3 楼 BenChiM888 的回复:引用 1 楼 BenChiM888 的回复:SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeginwhen ……


非得这么较真弟弟  oracle触发器的问题,请教大家
完整的编译通过的代码:

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的处理情况。

#9


引用 8 楼 BenChiM888 的回复:
引用 6 楼 edcvf3 的回复:
引用 5 楼 BenChiM888 的回复:引用 4 楼 edcvf3 的回复:
引用 3 楼 BenChiM888 的回复:引用 1 楼 BenChiM888 的回复:SQL code?1234567create  trigger tr_insert  after insert or update on table_namefor each rowbeg……

oracle触发器的问题,请教大家
不是较真,是因为没见过after触发里还能修改:new值的
我的我知道update处理的话会造成死循环,所以没处理update的

如果用before 那就好办了嘛

#10


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

#11


顶10楼的,之前触发

#12


菜鸟路过~~~~

#13


引用 1 楼 BenChiM888 的回复:
SQL code
?



12345678

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


这个正解

#14


引用 1 楼 BenChiM888 的回复:
SQL code
?



12345678

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

顶一个