DML 触发器2

2.行级触发器的关联标识符 :new,:old

    >>1. 一般通过:new.filed 引用(filed是trigger_table的字段名)
:new :old中filed字段的意义
触发语句 :old  :new
    insert 未定义--所有字段为null 触发语句完成时,要插入的值
    update 更新以前相对应记录行的值 触发完成后,要更新的值
    delete 删除以前记录行的值         未定义-null

     >>2. :new,:old的用法

create or replace trigger GenerateAuthorId
    before insert on or update on Authors
    for each row
begin
    select author_sequence.nextval
    into :new.ID    --:new.ID表示触发完成后,要插入的值. 就是说将 -1改为nextval
    from dual;
end GenerateAuthorId;
/

insert into authors(ID,first_name,last_name)
vaules(-1,'David','Zheng');

  新插入的ID的值将会是author_sequence.nextval不是-1.

  >>3.虽然:new,:old的类型是trigger_table%rowtype,但是不能整体赋值,只能为每一个属性赋值(有点像C中结构体)

create or replace trigger TempDelede
    before delete on temp_table
    for each row
declare
    v_TempRec temp_table%rowtype
begin
    v_TempRec:=old;  --错误赋值,会编译报错
    v_TempRec.char_col:=:old.char_col;  --正确赋值
    v_TempRec.num_col:=:old.num_col;    --正确赋值
end TempDelede;
/

  >>3. referencing 子句
语法:referencing[old as old_name][new as new_name]
这样就可以用old_name代替:old。注意referencing 中都不带冒号,但是实际使用是还是要加冒号的。

create or replace trigger GenerateAuthorId
    before insert on or update on Authors
    referencing new as new_author     --都不带冒号
    for each row
begin
    select author_sequence.nextval
    into :new_author.ID    --带冒号
    from dual;
end GenerateAuthorId;
/

  >>4.when子句
when语句在行级触发器中起限制作用
when trigger_condition
new,old 在trigger_condition中都和referencing一样不加冒号

create or replace trigger CheckPrice
    before insert or update  of price on books
    for each row
    when  (new.price>500.00)  --new没加冒号
begin
    DBMS_OUTPUT.PUT_LINE('price is higher than 500');
end CheckPrice;
/

  >>5.触发器谓词:inserting,updating,deleting
inserting,updating,deleting是布尔函数,在使用相应的触发器会返回True 或者False

谓词         行为特征
inserting 如果激活语句是insert,就为True,否则为False
updating 如果激活语句是update,就为True,否则为False
deleting 如果激活语句是delete,就为True,否则为False

eg.当改变inventory表时,使用invent_audit表记录 更改的用户名,更改的类型,更改了什么

create table inventory_audit(
    change_type char(1) not null, 
    change_by varchar2(8) not null,
    timestramp date not null,
    old_isbn char(10),
    new_isbn char(10),
    old_status varchar(25),
    new_status varchar(25),
    old_amount varchar(25),
    new_amount varchar(25)
    );   ---创建 inventory_audit


create or replace LogInventoryChanges
    before insert or update or delete on inventory
    for each row
declare
    v_ChangeType char(1);
begin
    if inserting then v_ChangeType='I'  --用I表示Insert
    elsif updating then v_ChangeType='U'
    else v_ChangeType='D'
    insert into inventory_audit(    --将改变的状态插入到inventory_audit表中
        change_type,change_by,timestamp,
        old_isbn,new_isbn,old_status,new_status,old_amount,new_amount
        )
    vaules(
        v_ChangeType,user,sysdate,
        :old.isbn,:new.isbn,:old.status,:new.status,:old.amount,:new.amount
        )
end LogInventoryChanges;
/
原文地址:https://www.cnblogs.com/qianwen/p/3766202.html