第12章 触发器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Declare @NumOfStuent Tinyint Select @NumOfStuent=c.student_num from class c,inserted I where c.class_id=I.class_id If (@NumOfStuent>0) begin update class set student_num=student_num+1 from class c, inserted I where c.class_id=I.class_id end Else begin update class set student_num=( select count(s.student_id) from student s,inserted I where s.class_id=I.class_id) from class c,inserted I where c.class_id=I.class_id end go

运行
Select * from department Update teacher set department_id=‘dep_01’ where teacher_name=‘潘惠’ Select * from department

分析执行过程

Deleted 表和inserted 表 问题:
end go
二、使用企业管理器创建触发器

在企业管理器中,展开指定的服务器和数据库项,然后 展开要在其上创建触发器的表所在的数据库,用右键单击该 表,从弹出的快捷菜单中选择所有任务子菜单下的管理触发 器选项,则会出现触发器属性对话框。在该对话框中,在名 称文本框中选择新建,然后在文本框中输入触发器文本。单 击“检查语法”按钮,则可以检查语法是否正确。单击“应 用”按钮,则在名称下拉列表中会有新创建的触发器名称。 最后,单击“确定”按钮,即可关闭该对话框,成功创建触 发器。 举例


分类:
INSERT触发器 UPDATE触发器 DELETE触发器
触发器的优点

触发器是自动的:当对表中的数据作了任何修改(比如手工 输入或者应用程序采取的操作)之后立即被激活。 触发器可以通过数据库中的相关表进行层叠更改。 触发器可以强制限制,这些限制比用 CHECK 约束所定义的 更复杂。
运行 Select *from class where class_id=‘g99403’ Delete from student where student_id= ‘g9940306’ Select *from class where class_id=‘g99403’

分析执行过程
3.创建更新触发器

只要对表中的数据进行更新,这种更新无论是对表中的一行或多行, 还是一列或多列,都将执行触发器。 实际应用中,可能只关心特定的列是否被更新。若特定的列被更新, 则执行触发器,否则不执行触发器:If update <列名>

例12-4:根据例12-3,使用if update 优化,只对特定的列更新执行触发 器操作。
1.创建insert触发器

例12-1:为student 表建立insert 触发器以自动更新class表的 学生人数。
use jwgl Go /*如果存在同名的触发器,则删除之 */ If exists(select name from sysobjects Where type=‘TR’ AND name=‘student_insert’) Drop TRIGGER student_insert Go /*建立插入触发器*/ Create TRIGGER student_insert on student For insert As
Declare @NumOfStuent Tinyint Select @NumOfStuent=c.student_num from class c,deleted d where c.class_id=d.class_id If (@NumOfStuent>0) begin update class set student_num=student_num-1 from class c, deleted d where c.class_id=d.class_id end Else begin update class set student_num=( select count(s.student_id) from student s,deleted d where s.class_id=d.class_id) from class c, deleted d where c.class_id=d.class_id end go

ຫໍສະໝຸດ Baidu
触发器的工作原理
相关概念
触发器表 Insert 表和delete 表:临时表,结构,内存

分类及工作原理:
Insert触发器的工作原理 delete触发器的工作原理
update触发器的工作原理
12.2 触发器的创建

创建触发器应该考虑以下几个问题:
1. 2.
CREATE TRIGGER 语句必须是批处理中的第一个语句。 创建触发器的权限默认分配给表的所有者,且不能将该权限转给其 他用户。
update department set teacher_num=( select count(t.teacher_id) from teacher t,inserted I where t.department_id=I.department_id) From department d,inserted I where d.department_id=i. department_id update department set teacher_num=( select count(t.teacher_id) from teacher t,deleted e where t.department_id=e.department_id) From department d, deleted e where d.department_id=e.department_id go
第12章 触发器
计算机系 软件教研室
第12章 触发器
目标:
触发器的基本概念及工作原理 如何创建触发器
触发器如何实现数据完整性
如何查看、修改、删除触发器
第12章 触发器
概述 12.2 触发器的创建 12.3 触发器实施数据完整性实例 12.4 查看修改和删除触发器 12.5 注意事项 练习
3.
4.
触发器为数据库对象,其名称必须遵循标识符的命名规则。
虽然触发器可以引用当前数据库以外的对象,但只能在当前数据库 中创建触发器。
5.
虽然不能在临时表或系统表上创建触发器,但是触发器可以引用临 时表。
当创建一个触发器时必须指定: ⑴名称;⑵在其上定义触发器的 表;⑶触发器将何时激发;⑷激活触发器的数据修改语句。

例12-3:为teacher表创建update触发器,在教师数据变更时自动更新 department表的教师人数。 use jwgl Go /*如果存在同名的触发器,则删除之 */ If exits(select name from sysobjects Where type=‘TR’ AND name=‘student_update’) Drop TRIGGER student_update Go /*建立更新触发器*/ Create TRIGGER student_update on teacher For update As

分析执行过程
2.创建删除触发器

例12-2:为student 表建立delete 触发器以自动更新class表的学生人数。 use jwgl Go /*如果存在同名的触发器,则删除之 */ If exists(select name from sysobjects Where type=‘TR’ AND name=‘student_delete’) Drop TRIGGER student_delete Go /*建立删除触发器*/ Create TRIGGER student_delete on student For delete As

12.3触发器实施数据完整性实例
1.
实现参照完整性
[例12-5] 向teacher_course_class 表中添加一行数据,检查所插入数据 的有效性。确保教师(teacher_id)存在teacher表中,课程 (course_id)存在于course表中,班级(class_id)存在于 class表中。 Create trigger tcc_insert on teacher_course_class For insert As If( (not exists(select teacher_id from teacher where teacher_id in (select teacher_id from inserted )) ) or
use jwgl
Go /*如果存在同名的触发器,则删除之 */ If exits(select name from sysobjects Where type=‘TR’ AND name=‘student_update’) Drop TRIGGER student_update Go /*建立更新触发器*/ Create TRIGGER student_update on student For update As
/* 如果更新teacher表中的department_id 列,则执行对department表的 teacher_num列的更新*/ if update (department) begin
update department set teacher_num=( select count(t.teacher_id) from teacher t,inserted I where t.department_id=I.department_id) From department d,inserted I where d.department_id=i. department_id update department set teacher_num=( select count(t.teacher_id) from teacher t,deleted e where t.department_id=e.department_id) From department d, deleted e where d.department_id=e.department_id
运行 Select *from class where class_id=‘g99403’ Exec spAddStudent ‘g9940306’,’程涛’,‘男’,‘1981-922’,‘g99403’,’1999-9-1’,’南京市御道街2号’ Select *from class where class_id=‘g99403’
6.
方法:
企业管理器 T-SQL语句
一、使用T-SQL语句创建触发器
其语法形式如下:
CREATE TRIGGER trigger_name ON {table|view} [WITH ENCRYPTION] FOR {[DELETE][,][INSERT][,][ UPDATE ]} AS sql_statement
12.1
12.1 概述

触发器(Trigger)是一种实施复杂数据完整性的特殊存储过程, 在对表或视图执行UPDATE、INSERT或DELETE语句时自 动触发执行,以防止对数据进行不正确、未授权或不一致的 修改。 触发器是一种特殊类型的存储过程,它不同于前面介绍过的 存储过程。触发器主要是通过事件进行触发而被执行的,而 存储过程可以通过存储过程名称而被直接调用。 触发器是一个功能强大的工具,它使每个站点可以在有数据 修改时自动强制执行其业务规则。触发器可以用于 SQL Server 约束、默认值和规则的完整性检查。
相关文档
最新文档