一、目的与要求
- 掌握编写数据库存储过程的方法。
- 掌握建立数据库触发器的方法,通过实验观察触发器的作用和触发条件设置等相关操作。
二、实验准备
- 了解编写存储过程和调用的T-SQL语法;
- 了解触发器的作用;
- 了解编写触发器的T-SQL语法。
三、实验内容
(一)存储过程
在studentdb数据库中建立存储过程getPractice,查询指定院系(名称)(作为存储过程的输入参数)中参与“实践”课程学习的所有学生学号、姓名、所学课程编号和课程名称,若院系不存在,返回提示信息。
提示:D_Info表中存储了院系代码D_ID,而St_Info表中学号字段St_ID的前两位与之对应,则D_Info表与St_Info表之间的联系通过这两个字段的运算构成连接条件。
(1)分别执行存储过程getPractice,查询“法学院”和“材料科学与工程学院”的学生中参与“实践”课程的所有学生学号、姓名、所学课程编号和课程名称。
(2)利用系统存储过程sp_rename将getPractice更名为getPctStu
(3)修改存储过程getPctStu,返回指定院系中参与实践课程的学生人次数,并利用该存储过程以“法学院”为输入参数验证执行的结果
(4)再修改存储过程getPctStu,返回指定院系中参与实践课程的学生人数。
注:“人数”和“人次数”是不同的,对某一学生而言,如果参与了多门实践课程,则“人次数”是指其参与的课程门数,而“人数”仍为1。
(二)触发器
1.在studentdb数据库中建立一个具有审计功能的触发器:
触发器名为tr_sc(图7-7),功能要求:审计在s_c_info表中对score字段的更新和插入操作,将这些操作记录到sc_log表(图7-8)中,sc_log表中有如下字段:操作类型type,学号st_id,课程号c_no,旧成绩oldscore,新成绩newscore,操作员uname,操作时间udate,其中操作员设定默认值为user,操作时间默认值为系统时间。
2. 在s_c_info表上建立一个触发器tr_updasc,用于监控对成绩的更新,要求更新后的成绩不能比更新前低,如果新成绩低则取消操作,给出提示信息,否则允许更新。
(三)查看存储过程和触发器的信息
1.用sp_help查看以上建立的存储过程和触发器的基本信息
2.用sp_helptext查看存储过程和触发器的代码
四、思考与练习
1.存储过程如何加密?
答:
存储过程加密是一种保护数据库中敏感信息的安全措施。下面是一些常见的存储过程加密方法:
1. 数据库提供的加密功能:某些数据库管理系统(如SQL Server)提供了内置的加密功能,可以使用这些功能对存储过程进行加密。这些功能通常使用对称或非对称加密算法来加密存储过程的代码。
2. 第三方工具:有些第三方工具专门用于数据库对象的加密,包括存储过程。这些工具提供了更多的加密选项和灵活性,可以根据需要选择合适的加密算法和密钥管理方式。
3. 自定义加密方案:开发人员可以自行实现存储过程的加密方案。这通常涉及使用加密算法对存储过程代码进行加密,并使用密钥来保护加密算法的安全性。自定义加密方案需要开发人员具备一定的加密知识和技能。
无论使用哪种加密方法,都需要注意以下几点:
- 密钥管理:密钥是加密的核心,需要妥善管理。密钥应该存储在安全的位置,并只授权给有权限访问存储过程的人员。
- 性能影响:加密和解密过程会增加存储过程的执行时间和资源消耗。在选择加密方法时,需要权衡安全性和性能之间的平衡。
- 维护和管理:加密存储过程后,需要确保适当的管理和维护,包括备份和恢复密钥,更新加密算法等。
需要注意的是,存储过程加密只是保护存储过程代码的一种手段,仍然需要综合考虑数据库的整体安全性,包括访问控制、身份验证、审计等方面的措施。
2.触发器有什么好处和坏处?
答:
触发器是数据库中的一种特殊对象,它在指定的数据库操作(如插入、更新、删除)发生时自动触发执行一段预定义的代码。触发器有以下好处和坏处:
好处:
1. 数据完整性保护:触发器可以用于实施数据完整性规则,确保数据库中的数据符合预期的约束条件,从而提高数据的准确性和一致性。
2. 数据一致性维护:通过触发器,可以在数据库操作时自动更新相关的数据,保持数据的一致性。例如,在更新某个表的同时,触发器可以更新其他相关表中的数据,确保数据的同步。
3. 安全性增强:触发器可以用于实施安全策略,例如在插入、更新或删除数据时进行权限验证,确保只有授权的用户可以执行相关操作。
4. 业务逻辑实现:触发器可以用于实现复杂的业务逻辑,如计算字段值、生成自动编号等。通过触发器,可以在数据库层面上实现业务规则,减少应用程序的复杂性。
坏处:
1. 性能影响:触发器的执行会占用数据库资源,可能导致数据库性能下降。特别是当触发器的逻辑较为复杂或触发频率较高时,会对数据库的性能产生较大的影响。
2. 隐式操作:触发器的存在可能导致部分操作变得隐式化,不易被开发人员察觉和控制。这可能增加代码的复杂性和维护难度。
3. 调试和测试困难:触发器的逻辑通常在数据库中执行,不易进行单元测试和调试。当触发器存在问题时,定位和修复可能较为困难。
因此,在使用触发器时,需要权衡其带来的好处和坏处,确保在合适的场景下使用,并进行适当的性能优化和测试。