实验背景
以校园书店运营为场景,设计数据库表结构、插入测试数据,完成 4 类触发器的设计与验证,掌握 Oracle 触发器的应用,模拟企业数据完整性保障、操作审计等场景。
一、基础表与用户准备
1. 基础表结构
- 图书信息表:图书编号、图书名称、售价、库存数量
- 图书批量操作日志表:日志编号、操作类型(批量插入 / 更新 / 删除)、操作时间、操作人(数据库用户名)
- 图书销售记录表:销售单号、图书编号、销售数量、销售日期、销售员
- 图书库存变更明细日志表:日志编号、图书编号、变更类型、变更数量、变更时间、销售员
2. 要求
- 每个表插入至少 3 条测试数据;
- 创建多个数据库用户(如前台、管理员),模拟多角色协作操作。
二、语句级触发器
操作意义
监控整表的批量操作,高效记录操作整体情况,是企业高危批量操作审计的常用手段,保障数据操作的可追溯性。
触发器配置
- 触发对象:图书信息表
- 触发时机:AFTER
- 触发事件:INSERT、UPDATE、DELETE
- 触发类型:语句级(仅触发一次,与受影响行数无关)
- 功能:执行批量 INSERT/UPDATE/DELETE 后,向 “图书批量操作日志表” 插入 1 条审计记录,记录操作类型、操作时间(SYSDATE)、操作人(USER 函数)。
触发器验证
执行批量插入 2 条新图书、批量更新图书售价、批量删除图书,查询日志表,验证是否生成对应记录(每条批量操作仅 1 条日志)。
三、行级触发器
操作意义
对每行数据操作做精细化控制,是企业实现数据联动更新、保障数据一致性的核心手段(如销售扣库存、订单处理)。
触发器配置
- 触发对象:图书销售记录表
- 触发时机:BEFORE
- 触发事件:INSERT
- 触发类型:行级(FOR EACH ROW,每条新记录触发)
- 功能:
- 校验库存:若销售数量>库存,用
RAISE_APPLICATION_ERROR抛出自定义异常(如 - 20001,“库存不足”),终止插入; - 扣减库存:库存充足时,更新 “图书信息表” 的库存数量(原库存 - 销售数量);
- 记录明细:向 “图书库存变更明细日志表” 插入 1 条销售出库记录。
- 校验库存:若销售数量>库存,用
触发器验证
- 插入合法销售记录(数量≤库存):验证库存扣减、日志记录是否生效;
- 插入超库存记录:验证异常是否触发。
四、INSTEAD OF 触发器
操作意义
解决不可更新视图的操作问题,让用户直观操作视图,后台自动转换为基表操作,广泛应用于企业报表系统。
触发器配置
- 创建视图:基于 “图书信息表” 和 “图书销售记录表” 的销售统计视图(含图书编号、图书名称、总销售数量);
- 触发对象:销售统计视图
- 触发时机:INSTEAD OF
- 触发事件:UPDATE
- 功能:将视图修改 “总销售数量” 的操作,转换为向 “图书销售记录表” 插入新记录的操作:
- 计算新总数量与原数量的差值(差值需为正,否则抛异常);
- 向销售表插入 1 条销售记录,销售数量为该差值,销售员填 “视图更新”。
触发器验证
- 修改视图中某商品总销售数量为更大值:验证销售表是否新增记录、视图数据是否更新;
- 尝试修改为更小值:验证异常是否触发。
五、LOGON/LOGOFF 触发器
操作意义
是数据库安全审计的重要工具,记录用户访问轨迹,保障数据库安全,是金融、零售等行业的必备配置。
前置准备
- 用户操作审计表:日志 ID、用户名、操作类型(登录 / 登出)、操作时间
触发器配置
- LOGON 触发器:
- 触发时机:AFTER LOGON
- 功能:向 “用户操作审计表” 插入登录记录;
- LOGOFF 触发器:
- 触发时机:BEFORE LOGOFF
- 功能:向 “用户操作审计表” 插入登出记录。
触发器验证
退出并重新登录数据库,正常退出后再次登录,查询审计表,验证是否生成登录、登出记录。