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. Springboot security cas整合方案-实践篇

    承接前文Springboot security cas整合方案-原理篇,请在理解原理的情况下再查看实践篇 maven环境 <dependency> <groupId>org.s ...

  2. Java流机制学习

    基本概念 BaseStream 基础流是一个可行并行或者串行的汇聚操作的元素序列.可以进行顺序遍历,也可以进行并发遍历.通过它也可以得到一个并行流或者串行流. Stream 是Java中流的表现接口, ...

  3. 模拟器配置使用Fildder进行抓包,包含Https+证书

    1.首先,百度检索.参考别人的,大致上都是到安装证书就失败了.我后面只说几个关键点. 2.安装证书,必须设置屏幕密码.我最开始使用把cef拷贝到,手机结果出现bug,安装不了.后来采用了在手机内部访问 ...

  4. VUE 2.0 引入高德地图,自行封装组件

    1. 高德地图官网 申请帐号, 申请相应(JavaScript API)的 Key 2. 在项目中引入, 这里和其他的引入不同的是 直接在 index.html, 不是在 main.js 引入, 博主 ...

  5. 5.C++里的4种新型类型转换

    1首先来回顾C的强制转换 大家都知道,在编译C语言中的强制转换时,编译器不会检查转换是否成功,都会编译正确. 比如: #include "stdio.h" struct Posit ...

  6. php实现粘贴截图并完成上传功能

    <?php header("Access-Control-Allow-Origin:*"); $url = 'http://'.$_SERVER['HTTP_HOST']; ...

  7. 打开word时出现the setup controller has encountered a problem during install解决办法

    问题电脑为win7,office是默认安装 删除下面文件夹即可解决该问题 C:\Program Files\Common Files\Microsoft Shared\OFFICE12\Office ...

  8. VC下防止反汇编的办法(1)

    最近在看IDA的书,讲汇编语言的部分提到了一种防止递归向下汇编器逆向程序的方法 这里esp指向栈顶,也就是调用方最后入栈的返回地址.然而实际在VC2017里用内联汇编这么做是不行的,原因可以看看VC生 ...

  9. 初步探究Android App API接口测试--实战

    一.Android App API接口测试 1.如何学好Android App API接口测试 postman可以用来实现API接口自动化测试,但是也有弊端,无法实现接口测试数据的参数化,为了达到接口 ...

  10. WordPress 实现附件上传自动重命名但不改变附件标题

    WordPress 上传媒体文件时,默认会保持文件名不变.如果上传文件名中包含中文字符,则会造成部分浏览器显示的文件 URL 疑似乱码甚至无法访问.网上流行较广的是通过注册  wp_handle_up ...