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;
/
DML 触发器2的更多相关文章
- SQL Server 数据库DML触发器 【一】
今天学习SQL Server数据库中DML触发器(DDL触发器以后有时间继续学习). 当删除一条创建有触发器的表中的内容时,触发器执行SQL语句. 1.首相先创建一张表,表名称是 [Test] , 内 ...
- 杂谈--DML触发器学习
触发器按类型分为三类: 1. DML 触发器,在数据变更时触发: 2. DDL 触发器,在修改数据库级别或实例级别对象时触发: 3. Login 触发器,在用户登录时触发: 最常见的是DML触发器,D ...
- DML触发器1
数据库触发器是特殊的存储程序.通常不直接调用它们,而是由数据库的事件触发. 触发器分类: >DML触发器 >instead-of触发器 >系统事件触发器,还可以是DDL 一. DML ...
- SQL语句(二十一)—— 触发器(DML触发器)
触发器 一 .触发器概述(特殊的存储过程) 定义: 在修改指定表值的数据时执行的 存储过程. 不同的是 : 执行存储过程要使用EXEC语句来调用,而触发器的执行不需要使用EXEC语句来调用. 作用: ...
- 触发器三(行级DML触发器)(学习笔记)
行级DML触发器 每当一条记录出现更新操作时进行触发操作定义时要定义FOR EACH ROW 使用":old.字段"和":new.字段"标识符 No. 触发语句 ...
- 触发器二(DML触发器)(学习笔记)
DML触发器(语句触发器) 由DML语句进行触发,当用户执行了INSERT,UPDATE,DELETE操作时就会触发操作 示例一.只有在每个月的10日才允许办理,新员工入职与离职,其他时间不允许增加和 ...
- 监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2)
原文:监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2) 在有些公司中,由于管理的不规范,或者是便于开发人员直接修改.部署程序,往往任何开发人员,都能登录到生产 ...
- 今天说一下DML触发器的顺序
因为05之后的版本允许了一个对象有多个after触发器,所以呢~顺序方面还是要留意一下下的.比如我现在要往一个测试表里面添加多个触发器. USE Test GO ,),Name )) GO CREAT ...
- 创建dml触发器
-实现删除学生信息时把该学生的成绩记录全部清空 --判断触发器是否存在 if exists(select * from sysobjects where name = 'delete_student' ...
随机推荐
- mongodb- Java API 查询操作
package com.x.mongodb; import java.net.UnknownHostException;import java.util.Collection;import java. ...
- ansible playbook实践(三)-yaml文件写法
playbook基于YAML语法来编写,基本语法规则如下: 1.大小写敏感 2.使用缩进表示层级关系 3.缩进时不允许使用Tab键,只允许使用空格 4.缩进的空格数目不重要,只要相同层级的元素左侧对齐 ...
- java中的各种Queue
java中的各种并发Queue可以归为以下的几种: ConcurrentLinkedQueue: 一个由链表结构组成的非阻塞队列 ArrayBlockingQueue :一个由数组结构组成的有界阻塞队 ...
- BZOJ 2502: 清理雪道 [最小流]
2502: 清理雪道 题意:任意点出发任意次每条边至少经过一次最小花费. 下界1,裸最小流.... #include <iostream> #include <cstdio> ...
- 联合查询到gridview
using com.DAL.Base; using DAL.ruanmou; using System; using System.Collections.Generic; using System. ...
- s5pv210 的启动
1.开发板已启动从0x0获取数据(内部64k的硬盘,里面含有三星固化的BL0段代码),将其读到a8软核中,进行运算,主要用于初始化时钟,96k的内部IRAM.并负责 指定启动设备(通常为外部硬盘),从 ...
- [Python Study Notes]CS架构远程访问获取信息--Client端v1.0
更新内容: 1.添加entry栏默认ip和port口 2.修正退出功能 3.添加退出自动关闭窗口功能 4.优化cpu显示为固定保留两位小数 '''''''''''''''''''''''''''''' ...
- POJ 1023 The Fun Number System
Description In a k bit 2's complement number, where the bits are indexed from 0 to k-1, the weight o ...
- [SDOI2015]序列统计
[SDOI2015]序列统计 标签: NTT 快速幂 Description 给你一个模m意义下的数集,需要用这个数集生成一个数列,使得这个数列在的乘积为x. 问方案数模\(1004535809\). ...
- ASP.NET Core 2.0 : 五.服务是如何加载并运行的, Kestrel、配置与环境
"跨平台"后的ASP.Net Core是如何接收并处理请求的呢? 它的运行和处理机制和之前有什么不同? 本章从"宏观"到"微观"地看一下它的 ...