数据库系统基础教程-第7章-约束和触发器.ppt
文本预览下载声明
7.3 修改约束 给约束命名 CONSTRAINT 约束名 CHECK(条件表达式) 例7.9 name CHAR(30) CONSTRAINT NameIsKey PRIMARY KEY, gender CHAR(1) CONSTRAINT NoAndro CHECK (gender IN(‘F’,‘M’)) CONSTRAINT RightTitle CHECK (gender=‘F’ OR name NOT LIKE ‘Ms.%’) 最好命名,如果不命名,系统会自动命名,而且会将所有约束集中在某一张系统表中。 7.3 修改约束 修改表上的约束 SET CONSTRAINT设定约束执行时机 ALTER TABLE配合DROP/ADD CONSTRAINT删除或添加约束 添加约束注意:要添加的约束必须能保证被关系当前的所有元组满足,否则添加失败 例7.10 7.4 断言 触发器和断言都是数据库模式的一部分 断言是SQL逻辑表达式,要求恒真 触发是和事件相关的动作发生时要执行的操作,主动元素 7.4 断言 断言 强制约束,其形式为: CREATE ASSERTION 断言名 CHECK (条件) 任何导致断言条件为假的数据库更新操作都会被拒绝,这是断言的本质特性! 注意和前面讲的约束之间的区别 约束只能针对当前关系,被引用的关系不受其约束,而断言是针对整个数据库的。 只涉及一个关系的约束,可以用基于元组的约束代替实现。 常用到EXISTS和SUM等聚集操作。 例7.11 建立断言表示资产值少于人不能成为电影公司经理。 例7.12 用断言和基于元组的约束实现规定电影公司的所有电影总长度不能超过10000分钟。 基于元组的约束实现,对元组的删除并不作检查,但如将此条件改为总长度的下限,则删除可能导致违反约束。 7.4 断言 约束和断言的比较 删除断言 DROP ASSERTION 断言名 约束类型 声明的位置 动作的时间 确保成立? 基于属性的CHECK 属性 对关系插入元组或属性修改时 如果是子查询,则不能确保 基于元组的CHECK 关系模式元素 对关系插入元组或属性修改时 如果是子查询,则不能确保 断言 数据库模型元素 对任何提及的关系做改变时 是 7.5 触发器 触发器(trigger) 也称作E-C-A规则,与之前几种约束的区别 当程序员声明的事件发生时被激活 事件种类通常是对某个特定关系的插入、删除或修改 激活后触发器测试触法的条件 如果条件不成立,则该触发器不做任何事情 如果触发器声明的条件满足,则DBMS执行动作 动作可以是任何数据库操作序列,包括与触法事件毫无关联的操作。 7.5 触发器 触发器的主要特征: 触发器的条件检查和动作可以在触发事件执行之前的数据库状态上或在触法动作被执行后的状态上执行; 条件和动作可以引用元组的旧值和/或触发事件中更新的元组的新值; 更新事件可以被局限到某个特定的属性或某些属性; 程序员可以选择动作执行的方式 行级触发器:一次只对一个更新元组 语句级触发器:一次针对在数据库操作中被改变的所有元组 7.5 触发器 SQL中的触发器示例 例7.13 实现一个应用在MovieExec表上的SQL触发器:当修改netWorth属性时,激发触发器,其作用是阻扰降低电影制作人净资产值的企图。 E在(2);C在(7);A在(8-10) 7.5 触发器 触发器设计的选项 保留字AFTER、BEFORE和INSTEAD OF; 触发事件可以是UPDATE、DELETE和INSERT; WHEN可选,没有表示无条件执行; 多个动作用BEGIN/END构造块; 新旧元组用OLD/NEW ROW AS标记;新旧表用OLD/NEW TABLE AS标记; FOR EACH ROW说明是行级触发,每修改一个元组就要执行一次触发器; FOR EACH STATEMENT说明是语句级触发,则每执行一句SQL语句才执行一次触发器,所以语句级一次要考虑多个元组的变化。 7.5 触发器 SQL中的语句级触发器 例7.14 看清触发器的功能,再看图7-6 E在(2);C在(7);A在(8-13) 其中A包含两个语句,先删除被修改过的元组,再插入这些元组的旧值,整体效果就是恢复 BEFORE触发器 在插入元组之前以某种方式处理被插入的元组 例7.15 对关系Movies插入电影元组,当不知道年份year 时,主属性又不能为NULL,因此用某个适当值替代NULL 7.5 触发器 第七章 约束与触发器 第七章 约束与触
显示全部