Sybase数据库基础知识.ppt
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
14-16 Sybase数据库基础知识
14.4.3 update 触发器与 inserted表和deleted表
执行命令 :
update publishers set pub_id = ?988 from publishers where pub_id = ?999
SQL Server publishers 表 执行删除 pub_id pub_name
14-6 Sybase数据库基础知识
14.1.3 触发器的触发(执行)
SQL Server
delete from titles ...
触发Trigger或使事务 回退或允许删除
• 一个数据修改语句(包括 insert, update或
delete语句)的执行只能触发相应的触发器一次。
• 触发器可以控制修改数据的事务是允许执行还
inserted表中存放着用于更新的新值。
14-17 Sybase数据库基础知识
用于检查列改变的update触发器
如果只关心特定的列是否被更新,若特定一列或多 列被更新,就执行触发动作,否则就不执行触发动 作。而不考虑其他列是否被更新时,可以使用触发 器条件 if update子句来实现。 语法: create trigger trigger_name on table_name
第十四章 触发器
Sybase数据库基础知识
14-1 Sybase数据库基础知识
本章概述
本章的目标是理解并掌握触发器和它们 的功能,描述触发器的作用及它们的通常用 法。
通过对本章的学习,你应能: • 定义触发器 • 创建简单触发器 • 创建含有事务控制语句的触发器
14-2 Sybase数据库基础知识
插入外键值 更新外键值 更新主键值 删除外键值 删除主键值
声明完整性 可以 可以 不可以 不适用 不可以
触发器 可以 可以 可以 可以 可以
注意: 如果在实际应用中,允许对主键值进行更新或删除操作,
应该使用触发器来维护主键与外键的依赖关系。
对于级联改变(级联更新或级联删除)只能使用触发础知识
是被回退。
14-7 Sybase数据库基础知识
应用
用户动作 • insert • delete • update
数据库
insert trigger
表
delete trigger
update trigger
14-8 Sybase数据库基础知识
14.2 创建触发器
语法:create trigger trigger_name
SQL Server publishers 表 执行删除 pub_id pub_name
1389 algodata infosystems
0877 Binnet &Hardly
Trigger
deleted 表 pub_id pub_name 0736 New Age Booksinserted 表
14-14 Sybase数据库基础知识
举例:创建用于检查列改变的update触发器
create triger trg_u_publishers on prblishers
for update as
-- 在publishers表上创建update触发器
declare @num_rows int
select @num_rows = @@rowcount
14-9 Sybase数据库基础知识
举例:
为titles表创建一个删除行操作时被触 发的触发器:
create trigger trg_d_titles on titles for delete as -- SQL语句或语句组 return
14-10 Sybase数据库基础知识
14.3 触发器的工作原理
举例:
创建触发器
create trigger trg_iu_sales on salesdetail for insert, update as decalre @num_rows int select @num_rows = @@rowcount if @num_rows = 0 return if (select count(*)
• 删除触发器 语法:drop trigger trigger_name
14-21 Sybase数据库基础知识
14.7 声明完整性与触发器
对于实现参照完整性的比较
参照完整性(Referential Integrity) 是指一个表(从表)的外键值与另
一个表(主表) 的主键值相匹配。SQL Server维护参照完整性是通过声 明完整性和触发器来实现的。这两种方法在实现参照完整性上,可列 表比较如下:
14.3.1 触发器工作中使用的两个专用表
客户方
Insert
Delete
Update
SQL Server方面 修改 inserted (i) / deleted (d) 表
插入新行
i :被插入的行
d:
i:
删去老的行
i:
d: 被删除的行
插入新行 删去老的行
i : 被插入的行
d : 被删除的行
14-11 Sybase数据库基础知识
• 触发器是实现复杂完整性约束的有效方法。
通过主键和外键的关联,实现了以下两种情形的参照完整性: •不能删除或更新主表中正在被相应从表中外键参照的主键值。 •不能向从表插入或更新在相应主表的主键列中不存在的外键值 。
14-5 Sybase数据库基础知识
触发器除能实现声明完整性所不能实现 的参照完整性外,它在应用中还扮演着其他 重要的角色,包括: • 维护复制数据 • 保持导出数据列的当前值 • 实现高级形式的业务规则或复杂行为限 制 • 实现定制记录
on table_name for { insert, delete, update } as SQL_statements return
注意:
• 触发器不能创建在临时表或视图上。 • 一个触发器只能作用于一张表,然而在同一触发器中可以 指定至多三种操作类型 (即同时指定insert, delete, update );反之,一个表至多可以有三个不同类型的触发器,分别针 对insert, delete和 update。
if @unm_rows = 0
return
if update(pub_id)
-- 主键已被更新了否?
begin
if @num_rows > 1
-- 不允许修改多行
begin
raiserror 31113 "UPdates to primary keys of multiple rows is not permited."
在 publishers 表上建立如下的触发器:
create trigger trg_d_publishers on publishers
for delete
as -- 如果没有行被删除,退出触发器。
if @@rowcount = 0
return -- 从publishers表中删除了行,也同时删除titles表中相 应的
1389 Algodata Infosystems 0877 Binnet & Hardly
deleted 表
pub_id pub_name
9999
Tech Books
Trigger
inserted 表
对于update触发器:
pub_id pub_name
9988
Tech Books
在 deleted表中存放的是被作用的表中要被更新的旧值,在
行计数在触发器工作中的作用:
• 知道受影响的行数避免执行不必要的操作 • 触发器利用行计数实现向从表插入或更新行的参照完
整性
14-13 Sybase数据库基础知识
14.4 举例
14.4.1 delete 触发器与 deleted 表
执行命令 :
delete publishers where pub_id =“0736”
本章要点
• 触发器的定义和作用 • 创建触发器 • 触发器的工作原理 • 声明完整性与触发器对于实现参照完整性的
比较 • 在触发器中的事务控制 • 触发器的嵌套 • 对触发器的限制和注意事项
14-3 Sybase数据库基础知识
14.1 触发器的定义和作用
14.1.1 触发器的定义
触发器(Trigger)是一种特殊类型的存储过程, 触发器的执行是通过事件来触发执行的。当用户对 指定的表进行修改(包括插入、删除和更新),SQL Server将自动执行在相应触发器中的SQL语句。
行
delete titles from titles t, deleted d where t.pub_id = d.pub_id
return
14-15 Sybase数据库基础知识
14.4.2 insert 触发器与 inserted 表
执行命令 :
insert titleauthor values (“998-72-3567”,“PS2106”,1,40)
14-19 Sybase数据库基础知识
14.5 多行考虑
实际应用中,常常需要触发器自动重复计 算总值,此时考虑多行情形显得特别重要。 若某个触发器用于维护含有 group by 子句或 实现隐式分组的总计值,则当向表中插入、 更新或删除行时,它将自动重新计算被修改 的组的总计值。
14-20 Sybase数据库基础知识
14.6 查看和删除触发器
• 查看触发器的正文信息 语法: sp_helptext trigger_name
• 查看触发器的一般信息 语法:sp_help trigger_name
• 查看触发器所引用的表或表所涉及的所有触发器 语法:sp_depends trigger_name sp_depends table_name
SQL Server为每个触发器都创建两个专用的工作 表:inserted表和deleted表。这两个表的结构总是与被 该触发器作用的表的结构相同。触发器工作完成,与 该触发器相关的这两个表也被删除。
• inserted表: 存放由 insert 或 update 语句的执行而
导致要加到该触发器作用的表中去的 任何新行。
• deleted表: 存放由delete或update语句的执行而导
致要从被该触发器作用的表中删除的 任何行。
14-12 Sybase数据库基础知识
14.3.1 触发器工作的行计数
全局变量@@rowcount中存放着最近一次操作
所影响 (或所 作用)的行数,这个 值是触发器工作中 一个非常有用 的值,任何一个可执行 的操作命令(除 declare 外)都会影 响 @@rowcount 的值, 对不返回行 计数的命令 (如 if ), 其值为零。
for { update , insert } as
if update (column_name)[{and|or}pudate(column_name)]...
SQL_statements if update (column_name)[{and|or}pudate(column_name)]
SQL_statements 14-18 Sybase数据库基础知识
stor_id 5023 5023 5023 7066 7131 7131
salesdetail
ord_num ABC-123-DEF-425-1Z3 NF-123-ADS-642-9G3 ZZ-999-ZZZ-999-0A0 234518 Asoap132 Fsoap867
主键
如果主键被更新或删除 外键值应如何变动?
rollback transaction
return
end
update titles set t.pub_id = i.pub_id from titles t, inserted i, deleted d
where t.pub_id = d.pub_id -- 级联更新titles表
end return
SQL Server
delete from titles ...
titles trg_d_titles
/*code*/
14-4 Sybase数据库基础知识
14.1.2 触发器的作用
stores
stor_id
5023 8042 7066
stor_name
Thoreau Reading Bookbeat Bamum’s
SQL Server 执行删除
titleauthor 表
au_id
title_id
172-32-1176 PS333
213-46-8915 BU1032
998-72-3567 PS2106
deleted 表
Trigger
inserted表
au_id
title_id
998-72-3567 PS2106