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;
/

DML 触发器2的更多相关文章

  1. SQL Server 数据库DML触发器 【一】

    今天学习SQL Server数据库中DML触发器(DDL触发器以后有时间继续学习). 当删除一条创建有触发器的表中的内容时,触发器执行SQL语句. 1.首相先创建一张表,表名称是 [Test] , 内 ...

  2. 杂谈--DML触发器学习

    触发器按类型分为三类: 1. DML 触发器,在数据变更时触发: 2. DDL 触发器,在修改数据库级别或实例级别对象时触发: 3. Login 触发器,在用户登录时触发: 最常见的是DML触发器,D ...

  3. DML触发器1

    数据库触发器是特殊的存储程序.通常不直接调用它们,而是由数据库的事件触发. 触发器分类: >DML触发器 >instead-of触发器 >系统事件触发器,还可以是DDL 一. DML ...

  4. SQL语句(二十一)—— 触发器(DML触发器)

    触发器 一 .触发器概述(特殊的存储过程) 定义: 在修改指定表值的数据时执行的 存储过程. 不同的是 : 执行存储过程要使用EXEC语句来调用,而触发器的执行不需要使用EXEC语句来调用. 作用: ...

  5. 触发器三(行级DML触发器)(学习笔记)

    行级DML触发器 每当一条记录出现更新操作时进行触发操作定义时要定义FOR EACH ROW 使用":old.字段"和":new.字段"标识符 No. 触发语句 ...

  6. 触发器二(DML触发器)(学习笔记)

    DML触发器(语句触发器) 由DML语句进行触发,当用户执行了INSERT,UPDATE,DELETE操作时就会触发操作 示例一.只有在每个月的10日才允许办理,新员工入职与离职,其他时间不允许增加和 ...

  7. 监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2)

    原文:监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2) 在有些公司中,由于管理的不规范,或者是便于开发人员直接修改.部署程序,往往任何开发人员,都能登录到生产 ...

  8. 今天说一下DML触发器的顺序

    因为05之后的版本允许了一个对象有多个after触发器,所以呢~顺序方面还是要留意一下下的.比如我现在要往一个测试表里面添加多个触发器. USE Test GO ,),Name )) GO CREAT ...

  9. 创建dml触发器

    -实现删除学生信息时把该学生的成绩记录全部清空 --判断触发器是否存在 if exists(select * from sysobjects where name = 'delete_student' ...

随机推荐

  1. jsp中实现点击文件名称完成下载

    1.文件名称添加点击事件 <a href="javascript:void(0);" id="wjm" onclick="wjxz();&quo ...

  2. Hello 2018

    愈发觉得写技术博客对于自己写作能力的提升会很有帮助,于是在今天终于用Github+Jekyll的方式搭建了自己的博客,从今往后就在这里记录自己在技术上成长的点滴,希望自己的总结和思考也能帮助到其他人. ...

  3. json模块和pickle模块的用法

    在python中,可以使用pickle和json两个模块对数据进行序列化操作 其中: json可以用于字符串或者字典等与python数据类型之间的序列化与反序列化操作 pickle可以用于python ...

  4. SpringMVC源码情操陶冶-HandlerAdapter适配器简析

    springmvc中对业务的具体处理是通过HandlerAdapter适配器操作的 HandlerAdapter接口方法 列表如下 /** * Given a handler instance, re ...

  5. 制作 alipay-sdk-java包到本地仓库

    一.首先 搭建好maven 基础环境,本地可以运行maven 命令 从支付宝官网上下载sdk https://doc.open.alipay.com/doc2/detail?treeId=54& ...

  6. 高斯消元 & 线性基【学习笔记】

    高斯消元 & 线性基 本来说不写了,但还是写点吧 [update 2017-02-18]现在发现真的有好多需要思考的地方,网上很多代码感觉都是错误的,虽然题目通过了 [update 2017- ...

  7. Java基础(含思维导图)

    很早之前整理的Java基础的一些知识点,思维导图: 1.'别名现象' 对一个对象赋值另一个对象,会指向新的对象引用,赋值前的对象引用会由于不再被引用而被gc回收: 而基本类型则不同.基本类型存储了实际 ...

  8. .NET常用第三方库(包)总结

    文章会不定期更新,以下内容均为个人总结,欢迎各位拍砖指正 序列化与反序列化 JSON.NET应该是.NET平台上使用最为广泛的序列化/反序列化包了,ASP.NET和ASP.NET Core中默认序列化 ...

  9. php 高并发下 秒杀处理思路

    1.用额外的单进程处理一个队列,下单请求放到队列里,一个个处理,就不会有并发的问题了,但是要额外的后台进程以及延迟问题,不予考虑. 2.数据库乐观锁,大致的意思是先查询库存,然后立马将库存+1,然后订 ...

  10. hdu4143 A Simple Problem

    A Simple Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...