新旧触发码

时间:2012-05-17 16:06:58

标签: sql triggers oracle10g

有人可以解释一下这意味着什么:

触发器代码中的

:new:old

4 个答案:

答案 0 :(得分:26)

:new:old是伪记录,可让您访问特定列的新值和旧值。如果我有桌子

CREATE TABLE foo (
  foo_id NUMBER PRIMARY KEY,
  bar    VARCHAR2(10),
  baz    VARCHAR2(10)
);

我插入一行

INSERT INTO foo( foo_id, bar, baz ) 
  VALUES( 1, 'Bar 1', 'Baz 1' );

然后在插入触发器之前的行级

:new.foo_id will be 1
:new.bar will be 'Bar 1'
:new.baz will be 'Baz 1'

,而

:old.foo_id will be NULL
:old.bar will be NULL
:old.baz will be NULL

如果您然后更新该行

UPDATE foo
   SET baz = 'Baz 2'
 WHERE foo_id = 1

然后在更新前的行级触发器

:new.foo_id will be 1
:new.bar will be 'Bar 1'
:new.baz will be 'Baz 2'

,而

:old.foo_id will be 1
:old.bar will be 'Bar 1'
:old.baz will be 'Baz 1'

如果我然后删除行

DELETE FROM foo
 WHERE foo_id = 1

然后在删除行级触发器之前,

:new.foo_id will be NULL
:new.bar will be NULL
:new.baz will be NULL

,而

:old.foo_id will be 1
:old.bar will be 'Bar 1'
:old.baz will be 'Baz 2'

答案 1 :(得分:3)

简明英语:

它们是别名,允许您访问列(旧)的方式以及列(新)的信息。

From Oracle documentation:

BEFORE和AFTER行触发器中都有旧值和新值。可以在BEFORE行触发器中分配新的列值,但不能在AFTER行触发器中分配(因为触发语句在触发AFTER行触发器之前生效)。如果BEFORE行触发器更改了new.column的值,则同一语句触发的AFTER行触发器将看到由BEFORE行触发器指定的更改。

关联名称也可以在WHEN子句的布尔表达式中使用。当冒号在触发器的主体中使用时,冒号必须位于旧限定符和新限定符之前,但在WHEN子句或REFERENCING选项中使用限定符时不允许使用冒号。

答案 2 :(得分:2)

在触发器中,:old记录包含触发语句执行前的值,:new记录包含执行后的值。

答案 3 :(得分:2)

old值是值before the changenew值是value to be changed,例如,在update set col1=10上,10是{ {1}}值和列中当前的值是旧的。

在插入时,没有旧值,只有new和删除时没有新值,只有旧