首页 > Linux操作系统 > Linux操作系统 > 默认值和触发器的顺序
今天在写触发器的时候突然想到这一点,为了验证想法,做了一个简单的例子。
如果一个字段拥有默认值,且包含一个BEFORE的行级触发器,当不指定值时,二者的生效顺序如何:
SQL> create table t_trigger_default (id number, col varchar2(30) default 'default');
Table created.
SQL> create trigger t_b_tri_def
2
before insert on t_trigger_default
3
for each row
4
begin
5
:new.col := 'trigger';
6
end;
7
/
Trigger created.
SQL> insert into t_trigger_default (id)
2
values (1);
1 row created.
SQL> select * from t_trigger_default;
ID COL
---------- ------------------------------
1 trigger
SQL> create or replace trigger t_b_tri_def
2
before insert on t_trigger_default
3
for each row
4
begin
5
:new.col := nvl(:new.col, 'trigger');
6
end;
7
/
Trigger created.
SQL> insert into t_trigger_default (id)
2
values (2);
1 row created.
SQL> select * from t_trigger_default;
ID COL
---------- ------------------------------
1 trigger
2 default
SQL> insert into t_trigger_default (id, col)
2
values (3, '');
1 row created.
SQL> select * from t_trigger_default;
ID COL
---------- ------------------------------
1 trigger
2 default
3 trigger
从这个例子可以看出,无论是DEFAULT值还是TRIGGER都是生效的,只不过TRIGGER在DEFAULT值之后生效。当一个列的值在插入时没有指定值,那么DEFAULT值就会生效,如果有触发器修改这个列的值,那么这个修改发生在DEFAULT值生效之后。一旦列输入了值,则DEFAULT值不再生效。
而AFTER触发器是无法修改列的值的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-719309/ ,如需转载,请注明出处,否则将追究法律责任。