数据库原理及应用实验报告-实验10-触发器

本报告详细介绍了通过实验加深对数据完整性的理解,学会创建和使用触发器的过程。实验包括为Teacher表建立不同类型的触发器,确保数据完整性约束的有效执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库原理及应用实验报告

 实验题目  实验10触发器  

10.1 实验目的

通过实验使学生加深对数据完整性的理解,学会理解、创建和使用触发器。

10.2 实验内容  (用实验9的Teacher表)

(1) 为Teacher表建立触发器T1,当插入或使更新表中的数据时,保证所操作的纪录的Tage值大于0。

(2) 为Teacher表建立触发器T2,禁止删除编号为00001的CEO。

(3) Teacher表中的人员的编号是唯一且不可更变的,创建触发器T3实现更新中编号的不可改变性。

(4) 演示违反T1触发器的约束的插入操作。

(5) 演示违反T1触发器的约束的更新操作。

(6) 演示违反T2触发器的约束的插入操作。

(7) 演示违反T2触发器的约束的更新操作。

10.3 实验步骤

(1) 仍然使用自定义完整性实验中的Teacher表。为此表建立触发器T1,当插入或使更新表中的数据时,保证所操作的纪录的Tage值大于0。

在新建查询窗口中输入如下SQL语句

USE University_Mis
GO
CREATE TRIGGER T1 ON Teacher
FOR INSERT,UPDATE
AS
IF(SELECT Tage FROM INSERTED)<1
BEGIN
PRINT ‘职工年龄必须是大于0的整数! 操作失败!’
ROLLBACK TRANSACTION
END

命令成功执行,如下图1

 

图1

 (2) 为Teacher表建立触发器T2,禁止删除编号为S01的CEO。

在新建查询窗口中输入如下SQL语句

USE University_Mis
GO
CREATE TRIGGER T2 ON Teacher
FOR DELETE
AS
IF(SELECT Tno FROM DELETED)=’T01’
BEGIN
PRINT ‘此人是CEO! 删除操作失败!’
ROLLBACK TRANSACTION
END

命令成功,如图2

 

图2

(3) Teacher表中的人员的编号是唯一且不可更变的,创建触发器T3实现更新中编号的不可改变性。

在新建查询窗口中输入如下SQL语句

USE University_Mis
GO
CREATE TRIGGER T3 ON Teacher
FOR UPDATE
AS
IF UPDATE(Tno)
BEGIN
PRINT ‘职工编号不能修改!’
ROLLBACK TRANSACTION
END

命令成功,如图3

 

图3

(4) 在新建查询窗口中输入如下SQL语句

USE University_Mis
INSERT INTO Teacher VALUES(‘T03’,’ 李宏’,’F’,-10,’开发部’)

插入元组失败,因为限制了年龄必须大于0,而这里是-10.如下图4

 

图4

错误消息:

职工年龄必须是大于0的整数! 操作失败!
消息 3609,级别 16,状态 1,第 1 行
事务在触发器中结束。批处理已中止

(5) 在新建查询窗口中输入如下SQL语句

USE University_Mis
UPDATE Teacher SET Tage=-7 WHERE Tno=’T01’

更新数据失败,因为限制了年龄必须大于0,而这里是-7,如下图5

 

图5

     错误消息:

     职工年龄必须是大于0的整数! 操作失败!

消息 3609,级别 16,状态 1,第 1 行
事务在触发器中结束。批处理已中止。

(6) 在新建查询窗口中输入如下SQL语句

USE University_Mis
DELETE FROM Teacher WHERE Tname=’李用’

删除失败,因为限制了删除CEO,而李用是CEO,报错如图6

 

图6

错误消息:

此人是CEO! 删除操作失败!
消息 3609,级别 16,状态 1,第 1 行
事务在触发器中结束。批处理已中止。

(7) 在新建查询窗口中输入如下SQL语句

USE University_Mis
UPDATE Teacher SET Tno=’T07’ WHERE Tsex=’F’

更新元组失败,因为限制了不能修改Tno属性,报错,如图7

 

图7

错误消息:

职工编号不能修改!
消息 3609,级别 16,状态 1,第 1 行
事务在触发器中结束。批处理已中止。

10.4 实验要求

(1) 实验之前请细细阅读实验总体要求与说明指导书

(2 ) 在SQL Server 2005或2008或2014的SSMS环境中,完成以上实验(1)-(7)步所有SQL数据定义操作,并将其中粗体步骤的操作窗口剪贴到实验报告中。

10.5实验体会

1)实验反思

  无

2)实验收获

触发器会在当系统检测数据中有违反完整性约束条件时给出用户必要的提示信息,还会引起系统内部自动进行某些操作,已消除违反完整性约束条件所引起的负面影响,具有安全保护的功能。

附录:

实验触发器实验报告 [实验目的] 1. 理解Oracle触发器的种类和用途 2. 掌握行级触发器的编写 [预备知识] 1. PL/SQL程序设计 [实验原理] 1. 建立触发器 CREATE [OR REPLACE] TRIGGER <触发器名> BEFORE"AFTER INSERT"DELETE"UPDATE OF <列名> ON <表名> [FOR EACH ROW] WHEN (<条件>) <PL/SQL 程序块> ON 子句中的名称识别与数据库触发器关联的数据库触发器事件指定了影响表的 SQL DML 语句 ( INSERT、 DELETE 或 UPDATE) AFTER 指定了触发器在处理完成后触发 BEFORE 指定了触发器在处理完成前触发 默认情况下,触发器每个表触发一次 FOR EACH ROW 选项指定触发器每行触发一次(即触发器为行级触发器) 要使触发器触发,WHEN 子句中布尔型表达式的值必须判定为 TRUE 可以将 REPLACE 添加到 CREATE 语句以自动删除和重建触发器 2. 行级触发器中引用表数据 在行级触发器中,使用伪记录来表示旧数据:old和新数据:new 引用示例::new.customer_name, :old.customer_name 3. 行级触发器中的谓词 在一个多条件触发的触发器中,使用谓词可以区分当前触发的操作的类型:inserting, updating,deleting。 示例: IF Inserting THEN 语句 ; END IF; IF Updating THEN 语句 ; END IF; IF Deleting THEN 语句 ; END IF; 4. 触发器的限制 SELECT 语句必须是 SELECT INTO 语句或内部游标声明。 行级触发器不可以对触发表进行查询,包括其调用的子过程中。 不允许 DDL 声明和事务控制语句 。 如果由触发器调用存储子过程,则存储子程序不能包括事务控制语句 。 :old 和 :new 值的类型不能是 LONG 和 LONG RAW。 [实验内容] 1. 给Customer表增加一列Savings,类型为int,来存放每个顾客的存款总额。 ALTER TABLE customer ADD (saving varchar2(30)); select * from customer; 2. 更新Customer表,使得Savings字段的值正确。 3. 在Account表上增加一个行级触发器,当对account的balance进行update和insert一个 记录时同步修改Customer的Savings字段,保证数据的一致性。 4. 对account进行update操作,记录account表和customer表的变化。 5. 去掉顾客- 存款账号表中引用account表的外键约束(如果不去掉,后面的操作无法实现。当然最 佳的方法是修改其外键约束的更新策略,但考虑到复杂性,这里使用不标准的做法, 但建议大家实际运用中不要这么做)。在顾客- 存款账号表插入一条记录,表明顾客开设了一个新的账户。 6. 将一条刚才新开账户号的存款记录插入账号表,记录account表和customer表的变化。 [实验总结] 1. 实验中遇到的问题和解决的方法。 ----------------------- "触发事件 ":old ":new " "Insert "无定义,所有字段都是N"该语句完成后插入的值 " " "ULL " " "Update "更新前该行的旧值 "更新后该行的值 " "Delete "删除前该行的值 "无定义,所有字段都是N" " " "ULL "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值