我是这样写的,但是提示错误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
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
你的触发器能编译通过?
#5
领会精神,你写的是个死循环弟弟。
#6
事实说话吧
你的
已用时间: 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
非得这么较真弟弟
完整的编译通过的代码:
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
不是较真,是因为没见过after触发里还能修改:new值的
我的我知道update处理的话会造成死循环,所以没处理update的
如果用before 那就好办了嘛
#10
行级Before触发器才能修改:NEW值,而行级after触发器不行
#11
顶10楼的,之前触发
#12
菜鸟路过~~~~
#13
这个正解
#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
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
你的触发器能编译通过?
#5
领会精神,你写的是个死循环弟弟。
#6
事实说话吧
你的
已用时间: 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
非得这么较真弟弟
完整的编译通过的代码:
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
不是较真,是因为没见过after触发里还能修改:new值的
我的我知道update处理的话会造成死循环,所以没处理update的
如果用before 那就好办了嘛
#10
行级Before触发器才能修改:NEW值,而行级after触发器不行
#11
顶10楼的,之前触发
#12
菜鸟路过~~~~
#13
这个正解
#14
顶一个