数据库对象(二)——存储过程、触发器

数据库中的基本对象是表。但是除了表以外,数据库中还有很多其他的对象,例如索引、视图、存储过程、触发器、游标、函数等。
这些数据库对象对于提高数据查询的效率、提升数据的安全性与完整性以及实现数据操作代码的共享性和数据操作的灵活性等方面起到了良好的辅助作用。在这里将对数据库中的部分对象:索引、视图、存储过程、触发器进行详细介绍。

前面我们已经介绍了数据库中的索引和视图,如果有不清楚的可以点击下面的链接查看前面的内容:
https://blog.csdn.net/Pipibabab/article/details/103110583

接下来将介绍MySQL数据库中常用的另外两种对象——存储过程和触发器

3、存储过程

存储过程类似于高级语言中的子程序或函数,是数据库服务器上一组预先编译好的SQL语句的集合,作为一个对象存储在数据库中,可以被客户端管理工具、应用程序和其他存储过程作为一个整体来调用。

存储过程在调用时可以带参数,其基本原理和函数调用类似。存储过程在接收输入参数后,按照预先编制的程序逻辑执行存储过程中的语句序列,最后向调用者返回处理结果。

存储过程的作用主要有以下几个方面:
(1)存储过程提高了程序设计的灵活性;
(2)存储过程实现了程序的模块化;
(3)存储过程有利于提高程序的执行速度;
(4)使用存储过程能减少网络访问的负荷;
(5)存储过程可被作为一种安全机制来充分利用。

创建存储过程

创建存储过程的一般语句序列为:

create procedure 存储过程名([参数定义[,...]])
   [存储过程选项]
begin
    语句序列;
end ;

例:

create procedure porcedureName () 
begin 
    select name from user; 
end; 
调用
	-- 调用过程 
call porcedureName ();  
删除存储过程
DROP PROCEDURE IF EXISTS porcedureName; -- 没有括号()
带参数的存储过程

例:在colloge数据库中创建一个名为p_vardep的存储过程,它能根据定义的系名查询并返回teacher表中相应系的老师的记录。

use colloge;
delimiter //
create procedure p_vardep(in depname varchar(30))

begin
    select * 
    from teacher
    where Dep = depname ;
end ;
//
delimiter ;

4、触发器(Trigger)

触发器是一种随既定条件发生而自动执行的特殊类型的无参数的存储过程。
也就是说,触发器其实是数据库中一种特殊的存储过程,它与存储过程的区别就在于触发器能够自动执行并且不含有参数

理论上数据库中所有的对象都可以设置触发器。但不同的数据库管理系统对触发器的支持各不相同。在SQL SERVER 2008以上的版本中就有用于数据定义(create、alter、drop)触发的DDL触发器,数据更新(insert、update、delete)时触发的DML触发器和用于系统安全管理的登录触发器等。而Mysql是在5.0版本才开始出现触发器,而且仅支持DML触发器。

触发器的优点主要表现在以下几个方面:
(1)只要触发事件发生,相应操作的触发器就会立即执行,从而不会出现当前事件发生后该做的操作被忘记或忽略的情况,提高了数据管理的效率和完整性。
(2)触发器的执行单元可以实现任意的数据操作,可以引用其他表的字段
(3)触发器激活后可以获取到表数据修改前后的状态(NEW、OLD),因而可以根据其差异采取相应的措施。
(4)触发器可以用程序方式检验和判断数据操作的结果,从而可以防止恶意的或错误的insert、update和delete操作。

SQL Server 包括两种常规类型的触发器:数据操作语言 (DML) 触发器数据定义语言 (DDL) 触发器。 在这里我们主要介绍DML触发器。

当INSERT、UPDATE 或 DELETE 语句修改指定表或视图中的数据时,可以使用 DML 触发器。

创建触发器

在MySQL中创建触发器的语句的语法格式为:

create trigger 触发器名
after[/before] insert/update/delete on 表名
for each row
begin 
    语句序列
end ;

【说明】
(1)insert/update/delete为三种触发事件
insert:在表中插入新纪录时触发;
update:更改表中记录时触发;
delete:从表中删除记录时触发。

(2)before/after为触发时间
before:先执行触发程序,再执行数据更新操作;适用于在实际的数据更新之前事先做一些检查和处理的情况。
after:先执行数据更新操作,再执行触发程序;适用于更新完成后自动再完成其他一些操作的情况。

(3)for each row 表示行级触发器,即数据更新操作影响的每一条记录都会执行一次触发程序。

(4)在触发程序中有两个特殊的系统对象 OLDNEW ,用于存放被更新的记录,供触发程序的语句使用。

  • OLD:表示被删除的记录。可以使用“OLD.字段名”访问被删除记录中的某个字段。OLD是只读的,只能引用它,不能更改它。
  • NEW:表示新插入的记录。可以使用“NEW.字段名”访问新纪录中的某个字段。在before触发程序中,由于实在实际的插入操作之前,所以可以使用SET命令修改NEW记录的值。但在after触发程序中,因为已经处于实际的插入操作之后,因此不能使用SEt命令再修改NEW记录的值。
  • OLD 和 NEW 仅能在触发程序中使用,其他地方使用无效。
  • 对于insert操作,只有NEW关键字是合法的。对于delete操作,只有OLD关键字是合法的。对于update操作,实际上删除旧记录而增加修改后的新纪录,所以NEW关键字和OLD关键字都可用。
查看触发器
show triggers
[from 数据库名|in 数据库名][like 表名模式|where 条件];
删除触发器
drop trigger [if exists]触发器名;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值