2012-05-17 34 views
5

可以有人请解释一下什么叫:新老触发代码

:new和触发代码:old

+0

这个功课? – Sparky

+0

给我们一些背景 – keyser

+0

这是一个修订问题,我正在准备,你必须回答这个问题:“触发代码中的新和旧意味着什么?” – user1300580

回答

24

: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'); 

然后在行级INSERT触发器之前

: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' 
2

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

3

用简单的英语:

它们的别名,让您从一列是如何(旧)获取信息,它怎么会(新)。

From Oracle documentation:

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

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

2

old值是值before the changenew值是value to be changed,因此,例如,在一个update set col1=10,10是new值和在列电流的值是在旧的。

在一个插入,没有旧值,只有新的和删除有没有新的价值,只有旧