当前课程知识点:数据库概论 > 第四章 数据库完整性、视图与安全性 > 4.4 触发器 > 触发器
同学们好
我是来自云南大学软件学院的包崇明
同学们好
我是来自云南大学软件学院的包崇明
我是来自云南大学软件学院的包崇明
我是来自云南大学软件学院的包崇明
下面为大家介绍触发器
下面为大家介绍触发器
一种是非过程性约束
前面我们学习了非过程性约束
前面我们学习了非过程性约束
又称为声明式约束
通过在创建表时
通过在创建表时
定义声明式约束来实现数据库逻辑设计
定义声明式约束来实现数据库逻辑设计
定义声明式约束来实现数据库逻辑设计
识别出来的多数数据完整性规则
识别出来的多数数据完整性规则
识别出来的多数数据完整性规则
识别出来的多数数据完整性规则
这些约束在执行SQL语句的更新过程中
这些约束在执行SQL语句的更新过程中
这些约束在执行SQL语句的更新过程中
始终是有效的
始终是有效的
始终是有效的
始终是有效的
能够防止错误的更新操作破坏数据的完整性
能够防止错误的更新操作破坏数据的完整性
能够防止错误的更新操作破坏数据的完整性
能够防止错误的更新操作破坏数据的完整性
能够防止错误的更新操作破坏数据的完整性
另外一种是过程性约束
除了非过程性约束
除了非过程性约束
除了非过程性约束
数据库管理系统还提供一种
数据库管理系统还提供一种
称为触发器的过程性约束方法
称为触发器的过程性约束方法
称为触发器的过程性约束方法
触发器能够通过编程来生成动态规则
触发器能够通过编程来生成动态规则
触发器能够通过编程来生成动态规则
能够实现比非过程性约束更复杂的功能
能够实现比非过程性约束更复杂的功能
能够实现比非过程性约束更复杂的功能
能够实现比非过程性约束更复杂的功能
触发器定义在表或者视图上
触发器定义在表或者视图上
触发器定义在表或者视图上
通过将表的插入
通过将表的插入
通过将表的插入
删除或者更新操作发生前
删除或者更新操作发生前
或者发生后定义为相应事件
或者发生后定义为相应事件
或者发生后定义为相应事件
并为这些事件定义相应的动作
在创建表的同时定义约束
当事件发生时
当事件发生时
在不同的商用数据库系统中
数据库管理系统触发和事件相对应的动作
数据库管理系统触发和事件相对应的动作
数据库管理系统触发和事件相对应的动作
来保证数据完整性和实现其他功能
来保证数据完整性和实现其他功能
来保证数据完整性和实现其他功能
来保证数据完整性和实现其他功能
来保证数据完整性和实现其他功能
来保证数据完整性和实现其他功能
一个基本的CREATE TABLE语句的语法
每种数据库管理系统
每种数据库管理系统
提供的触发器定义语句有细微的差别
提供的触发器定义语句有细微的差别
提供的触发器定义语句有细微的差别
我们在定义一个字段的时候
但基本机制时一致的
但基本机制时一致的
都涉及到表
更新操作类型
操作发生的时间和相应的代码段
操作发生的时间和相应的代码段
操作发生的时间和相应的代码段
操作发生的时间和相应的代码段
操作发生的时间和相应的代码段
下面我们以ORACLE数据库
的触发器语句做讲解
的触发器语句做讲解
的触发器语句做讲解
我们还可以定义涉及到
表中多个字段的约束
创建一个触发器
需要用CREATE TRIGGER语句
需要用CREATE TRIGGER语句
需要用CREATE TRIGGER语句
表示生成一个触发器对象
这种约束我们称为表级约束
后面需要指定一个触发器名称
后面需要指定一个触发器名称
后面需要指定一个触发器名称
列级约束和表级约束是数据库管理系统
接下来我们定义一个事件
接下来我们定义一个事件
提供的两种非过程性约束定义方式
事件的定义由操作和操作发生的时间构成
事件的定义由操作和操作发生的时间构成
事件的定义由操作和操作发生的时间构成
事件的定义由操作和操作发生的时间构成
操作是指INSERT、DELETE
操作是指INSERT、DELETE
操作是指INSERT、DELETE
或UPDATE中的一种或几种
或UPDATE中的一种或几种
或UPDATE中的一种或几种
时间有两个选择
时间有两个选择
before表示操作发生前
after表示操作发生后
after表示操作发生后
after表示操作发生后
对时间和操作进行组合
对时间和操作进行组合
需要在列上面定义外
我们可得到相应事件
我们可得到相应事件
我们可得到相应事件
比如我们可定义after insert
表示插入操作执行后事件触发
表示插入操作执行后事件触发
表示插入操作执行后事件触发
表示插入操作执行后事件触发
通过关键字when可定义一个搜索条件
通过关键字when可定义一个搜索条件
通过关键字when可定义一个搜索条件
通过关键字when可定义一个搜索条件
涉及到多个字段的约束
触发器触发后
涉及到多个字段的约束
将判断搜索条件是否满足条件
将判断搜索条件是否满足条件
才采用表级约束定义
只有满足搜索条件
只有满足搜索条件
才会执行相应的代码
才会执行相应的代码
才会执行相应的代码
需要在列名和类型后面加上一个空格
满足条件触发的动作
满足条件触发的动作
一般由一条或者多条SQL语句组成
一般由一条或者多条SQL语句组成
由BEGIN ATOMIC关键字开始
由BEGIN ATOMIC关键字开始
END关键字结束
触发器定义语法还提供了动作执行的频度
触发器定义语法还提供了动作执行的频度
触发器定义语法还提供了动作执行的频度
我们在所有列定义结束后才定义表级约束
有FOR EACH ROW和
有FOR EACH ROW和
有FOR EACH ROW和
有FOR EACH ROW和
FOR EACH STATEMENT
两个选项
FOR EACH ROW选项对受影响
FOR EACH ROW选项对受影响
的每一数据行都执行一次动作
的每一数据行都执行一次动作
FOR EACH STATEMENT选项
FOR EACH STATEMENT选项
只在操作结束时执行一次动作
只在操作结束时执行一次动作
不管受影响的数据有多少行
不管受影响的数据有多少行
我们来看一个表级约束的简化定义
每一个约束我们可定义一个可选的约束名
动作程序中的语句可能需要使用
一行数据在更新前或更新后的值
一行数据在更新前或更新后的值
一行数据在更新前或更新后的值
一行数据在更新前或更新后的值
加上关键字CONSTRAINT
为达到这个目的
我们可以用REFERENCING子句为
我们可以用REFERENCING子句为
被更新的一行或多行
被更新的一行或多行
被更新的一行或多行
甚至整个表定义相关名
甚至整个表定义相关名
通过这些相关名
通过这些相关名
下面我们看一下几种常见的约束
可访问更新前或者更新后的
行数据甚至更新前后整张表内容
行数据甚至更新前后整张表内容
行数据甚至更新前后整张表内容
定义表中一列或者多列组成该表的主键
下面我们分析一个触发器例子
下面我们分析一个触发器例子
下面我们分析一个触发器例子
也意味着组成主键的列
以加深对触发器的理解
以加深对触发器的理解
隐含定义了非空和唯一两个约束
在顾客信息表customers中插入行时
在顾客信息表customers中插入行时
我们需要实现这样一个约束
我们需要实现这样一个约束
折扣列discnt的值必须小于15
折扣列discnt的值必须小于15
否则插入失败
或者主键字段值在表中其他行中已经存在
前面我们已经用check约束实现了
前面我们已经用check约束实现了
前面我们已经用check约束实现了
保证了实体完整性
现在我们用触发器来实现这样一个约束
现在我们用触发器来实现这样一个约束
现在我们用触发器来实现这样一个约束
FOREIGN KEY
创建这个触发器的语句是:
创建这个触发器的语句是:
创建这个触发器的语句是:
创建这个触发器的语句是:
用来保证参照完整性
create trigger discnt_max
create trigger discnt_max
保证我们对一行中外键的取值要么为空
after insert on customers
referencing new as x
referencing new as x
referencing new as x
for each row
when ( x.discnt > 15.0 )
when ( x.discnt > 15.0 )
begin
生成一个错误信息
生成一个错误信息
end
也有多个保证参照完整性的选项
我们将在后面详细介绍
我们在表customers上创建了
名为discnt_max的触发器
名为discnt_max的触发器
名为discnt_max的触发器
名为discnt_max的触发器
在对表customers执行
insert语句后触发
insert语句后触发
子句referencing new as x
子句referencing new as x
表示给新插入的行数据设定一个相关名x
表示给新插入的行数据设定一个相关名x
表示给新插入的行数据设定一个相关名x
表示给新插入的行数据设定一个相关名x
这些列取值的组合在表中必须是唯一的
在后面的搜索条件中用到变量x
在后面的搜索条件中用到变量x
来表示新插入的行数据
来表示新插入的行数据
来表示新插入的行数据
导致这些列上组合值不是唯一的
那么更新或者插入操作将失败
我们用了for each row选项
表示对表customers插入一行后
表示对表customers插入一行后
表示对表customers插入一行后
表示对表customers插入一行后
也称为检查约束
这个触发器就会测试
这个触发器就会测试
WHEN子句中的搜索条件
WHEN子句中的搜索条件
discnt>15.0
discnt>15.0
如果该行的discnt字段值
如果该行的discnt字段值
如果该行的discnt字段值
大于15
大于15
将生成一条错误信息
表达式只能引用该列值
执行该插入命令的应用程序中
执行该插入命令的应用程序中
执行该插入命令的应用程序中
将会出现SQLERROR信息
新插入的行被删除
新插入的行被删除
现在我们已经学习了
现在我们已经学习了
Create table语句
Create table语句
提供的非过程性约束以及
提供的非过程性约束以及
create trigger语句提供的
过程性约束
过程性约束
两种约束各有优缺点
两种约束各有优缺点
那么更新或者插入操作将失败
一般建议尽量使用非过程性约束
一般建议尽量使用非过程性约束
触发器作为非过程性约束的补充
触发器作为非过程性约束的补充
好了同学们
好了同学们
好了同学们
我们这节课就到这里
我们这节课就到这里
它要求表中每一行数据在该列上不能取空值
再见
它要求表中每一行数据在该列上不能取空值
如果更新或者插入行
导致该列上的值为空
那么更新或者插入操作也将失败
除了上述约束
在对字段进行定义的时候
我们可以为该字段指定一个缺省值
这由关键字Default后面
给出该字段的缺省值
当插入一行数据时
如果没有指定该列的值
那么系统将用缺省值填充
如果没有指定缺省值
那么该列的值默认取空值
我们在定义约束的时候
注意定义的约束之间不能相互冲突
比如在一个字段上面定义非空约束后
不能再定义该列的缺省值为空
另外
主键约束在每张表中只能定义一个
下面我们通过一个创建表的例子
来进一步学习如何定义约束
我们用create table语句
创建表customers
并定义了三个列级约束和一个表级约束
在cid字段上
我们定义了一个列级约束not null
约束cid的取值不能为空
在city字段上
我们定义了一个缺省值约束
当插入新行时
如果没有指定city的值
系统将用‘New York’填充
在discnt字段上
我们定义了一个check约束
约束名为discnt_max
当插入或者更新操作时
将检查该行的discnt是否小于15
如果不满足
操作失败
最后我们定义了一个表级约束
在cid字段上定义了主键约束
好了同学们我们下节课再见
-数据库概述
--Video
-导论--数据库概述
-1.1 数据库基础
--Video
-第一章 数据库基础--1.1 数据库基础
-2.1 CAP数据库
--CAP数据库
-第二章 关系运算--2.1 CAP数据库
-2.2 自然关系运算1
-- 自然关系运算1
-第二章 关系运算--2.2 自然关系运算1
-2.3 自然关系运算2
--自然关系运算2
-第二章 关系运算--2.3 自然关系运算2
-3.1 SQL概述
-- SQL概述
-3.1 SQL概述--作业
-3.2 数据定义DDL
--数据定义DDL
-3.2 数据定义DDL--作业
-3.3 SQL数据更新DML
-3.3 SQL数据更新DML--作业
-3.4 复杂SQL查询操作1
-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1
-3.5 复杂SQL查询操作2
-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2
-4.1 数据完整性
-4.1 数据完整性--作业
-4.2 完整性约束
--完整性约束
-4.2 完整性约束--作业
-4.3 外键约束
--外键约束
-4.3 外键约束--作业
-4.4 触发器
--触发器
-4.4 触发器--作业
-4.5 视图
--视图
-4.5 视图--作业
-4.6 安全性
--安全性
-4.6 安全性--作业
-5.1 索引
--Video
-5.2 B+树索引
--Video
-6.1 函数依赖
--Video
-6.2 Armstrong公理
--Video
-6.3 无损分解
--Video
-6.4 范式举例
--Video
-6.5 三种范式
--Video
-6.5 三种范式--作业
-7.1-E-R模型概述
--E-R模型概述
-7.2 E-R模型详解
--Video
-7.3 E-R模型的拓展
--Video
-7.4 E-R模型实例分析
--Video
-8.1 事务的ACID性质介绍
--ACID介绍
-8.1 事务的ACID性质介绍--作业
-8.2 事务经历
--事务经历
-8.2 事务经历--作业
-8.3 可串行化调度和前趋图
-8.3 可串行化调度和前趋图--作业
-8.4 两阶段封锁
--两段锁协议
-8.4 两阶段封锁--作业
-8.5 隔离级别
--隔离级别
-8.5 隔离级别--作业
-8.6 事务恢复
--事务恢复
-8.6 事务恢复--作业
-9.1 数据库使用介绍
--数据库使用介绍
-9.2 Java访问数据库
-9.2 Java访问数据库--作业
-10.1 数据库新技术概述
--Video