数据库中的基本对象是表。但是除了表以外,数据库中还有很多其他的对象,例如索引、视图、存储过程、触发器、游标、函数等。
这些数据库对象对于提高数据查询的效率、提升数据的安全性与完整性以及实现数据操作代码的共享性和数据操作的灵活性等方面起到了良好的辅助作用。在这里将对数据库中的部分对象:索引、视图、存储过程、触发器进行详细介绍。
前面我们已经介绍了数据库中的索引和视图,如果有不清楚的可以点击下面的链接查看前面的内容:
https://blog.csdn.net/Pipibabab/article/details/103110583
接下来将介绍MySQL数据库中常用的另外两种对象——存储过程和触发器
存储过程类似于高级语言中的子程序或函数,是数据库服务器上一组预先编译好的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 ;
触发器是一种随既定条件发生而自动执行的特殊类型的无参数的存储过程。
也就是说,触发器其实是数据库中一种特殊的存储过程,它与存储过程的区别就在于触发器能够自动执行并且不含有参数。
理论上数据库中所有的对象都可以设置触发器。但不同的数据库管理系统对触发器的支持各不相同。在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)在触发程序中有两个特殊的系统对象 OLD 和 NEW ,用于存放被更新的记录,供触发程序的语句使用。
show triggers
[from 数据库名|in 数据库名][like 表名模式|where 条件];
drop trigger [if exists]触发器名;