首页 > 代码库 > DML 触发器2
DML 触发器2
2.行级触发器的关联标识符 :new,:old
>>1. 一般通过:new.filed 引用(filed是trigger_table的字段名)
触发语句 | :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; /
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。