本文共 3156 字,大约阅读时间需要 10 分钟。
触发器是用户定义在关系表上的由事件驱动的特殊过程。它能够在特定操作发生时自动执行预定义的规则,具备强大的数据控制能力。
触发器又被称为事件-条件-动作规则。当特定事件(如INSERT、UPDATE、DELETE等)发生时,触发器会检查条件,如果条件成立则执行相应的动作。动作通常是一段SQL存储过程。
触发器的基本格式如下:
CREATE TRIGGER [触发器名] { BEFORE | AFTER } [触发事件] ON [表名] REFERENCING NEW | OLD ROW AS [变量] FOR EACH {ROW | STATEMENT} [WHEN [触发条件] ] [触发动作体] 触发事件可以是INSERT、DELETE或UPDATE,也可以是这些事件的组合。例如,可以指定触发列(如UPDATE OF列名),以明确触发动作的具体列。
示例:在SC表上创建一个AFTER UPDATE触发器,用于记录成绩修改前的旧值和新值。具体实现如下:
create table SC_U ( Sno char(9), -- 学号 Cno char(4), -- 班号 Oldgrade smallint, -- 修改前的成绩 Newgrade smallint -- 修改后的成绩);create trigger SC_Tafter update of Grade on SCreferencing oldrow as OldTuple, newrow as NewTuplefor each rowwhen (NewTuple.Grade >= 1.1 * OldTuple.Grade)insert into SC_U (Sno, Cno, Oldgrade, Newgrade)values (OldTuple.Sno, OldTuple.Cno, OldTuple.Grade, NewTuple.Grade);
触发器的执行是由数据库服务器自动完成的,不需要手动激活。执行顺序通常为:
BEFORE触发器。AFTER触发器。删除触发器的语法如下:
DROP TRIGGER [触发器名] ON [表名];
存储过程和函数是数据库中可以重复调用、持久性存储模块。两者的主要区别在于:
语法格式:
CREATE OR REPLACE PROCEDURE [schema_name].[procedure_name] ([参数])AS[过程化SQL块];
示例:实现转账功能的存储过程。
-- 创建账户表drop table if exists Account;create table Account ( accountnum char(3) primary key, total float);insert into Account values ('101', 50), ('102', 100);-- 创建存储过程create or replace procedure Proc_TRANSFER@inAccount int, @outAccount int, @amount floatasbegin declare @totalDepositOut float, @totalDepositIn float, @inAccountnum int; -- 检查转出账户的余额 select @totalDepositOut = total from Account where accountnum = @outAccount; if (@totalDepositOut is null) begin print '转出账户不存在或账户中没有存款'; rollback transaction; return; end; -- 检查账户存款是否足够 if (@totalDepositOut < @amount) begin print '账户存款不足'; rollback transaction; return; end; -- 检查转入账户是否存在 select @inAccountnum = accountnum from Account where accountnum = @inAccount; if (@inAccountnum is null) begin print '转入账户不存在'; rollback transaction; return; end; -- 执行转账操作 update Account set total = total - @amount where accountnum = @outAccount; update Account set total = total + @amount where accountnum = @inAccount; print '转账完成,请取走银行卡'; commit transaction;end; 使用exec语句调用存储过程。
-- 示例调用exec Proc_TRANSFER @inAccount = 102, @outAccount = 101, @amount = 50;
修改存储过程的语法:
ALTER PROCEDURE [schema_name].[procedure_name] [修改内容];
删除存储过程的语法:
DROP PROCEDURE [schema_name].[procedure_name];
语法格式:
CREATE OR REPLACE FUNCTION [schema_name].[function_name] ([参数]) RETURNS [返回类型]AS[过程化SQL块];
使用call或select语句调用函数。
-- 示例调用call AvgAge('男'); 今天的课程让我对触发器、存储过程和函数有了更深入的理解。这三者在数据库开发中起着重要作用,尤其是在需要复杂业务规则或高效数据处理时,触发器和存储过程能够显著提升开发效率。通过实际案例的学习,我不仅掌握了相关语法,还对如何设计和优化这些组件有了初步的认识。虽然学习过程中遇到了一些困难,但通过查阅资料和参考博客,最终还是顺利完成了练习。这章内容的学习为后续的数据库开发打下了坚实的基础。
转载地址:http://flyk.baihongyu.com/