一、存储过程
SQL语句在执行时先要编译,然后再被执行。在大型数据库系统中,为了提高效率,将为了完成特定功能的SQL语句集进行编译优化后,存储在数据库服务器中,用户通过指定存储过程的名字来调用执行。
下面是一个创建存储过程的常用语法:
create procedure sp_name @[参数名][类型]
as
begin
......
end
调用存储过程语法:
exec sp_name[参数名]
删除存储过程语法:
drop procedure sp_name
使用存储过程可以增强SQL语言的功能和灵活性,由于可以用流程控制语句编写存储过程,有很强的灵活性,因此可以完成复杂的判断和运算,并且可以保证数据的安全性和完整性。同时,存储过程可以使没有权限的用户在控制之下间接地存取数据库,也保证了数据的安全。
需要注意的是,存储过程不等于函数,二者虽然本质上没有区别,但还是有如下几个方面的不同:
1、存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用。由于函数可以返回一个对象,因此它可以在查询语句中位于FROM关键字的后面。
2、一般而言,存储过程实现的功能较复杂,而函数实现的功能针对性较强。
3、函数需要括号包住输入的参数,并且只能返回一个值或表对象,而存储过程可以返回多个参数。
4、函数可以嵌入在SQL中使用,可以在SELECT调用,存储过程则不行。
5、函数不能直接操作实体表,只能操作内建表。
6、存储过程在创建时即在服务器上进行了编译,其执行速度比函数快。
二、触发器
触发器是一种特殊类型的存储过程,它由事件触发,而不是程序调用或手工启动,当数据库有特殊的操作时,这些操作由数据库中的事件来触发,自动完成这些SQL语句。使用触发器可以用来保证数据的有效性和完整性,完成比约束更复杂的数据约束。
触发器与存储过程的区别如下表所示:
根据SQL语句的不同,触发器可以分为DML触发器和DLL触发器。
DML触发器是当数据库服务器发生数据操作语言事件时执行的存储过程,有After和Instead Of这两种触发器。After触发器被激活触发是在记录改变之后进行的一种触发器。Instead Of触发器是在记录变更之前,去执行触发器本身所定义的操作,而不是执行原来SQL语句例的操作。
DDL触发器是在响应数据定义语言事件时执行的存储过程。
触发器的作用主要表现为以下几个方面:
1)增加安全性。
2)利用触发器记录所进行的修改以及相关信息,跟踪用户对数据库的操作,实现审计。
3)维护那些通过创建表时的声明约束不可能实现的复杂的完整性约束以及对数据库中特定事件进行监控与响应。
4)实现复杂的非标准的数据库相关完整性规则、同步实时地复制表中的数据。
5)触发器是自动的,它们在对表中的数据做了任何修改之后就会被激活,例如可以自动计算数值,若数据的值达到了一定的要求,则进行特定的处理。以某企业财务管理为例,如果企业的资金出现短缺,并且达到某种程度时,则会发送警告信息。
下面是一个触发器的例子,该触发器的功能是在每周末进行数据表更新,若当前用户没有访问WEEKEND_UPDATE_OK表的权限,则需要重新赋予权限。
CREATE OR REPLACE TRIGGER update_on_weekends_check
BEFORE UPDATE OF sal ON EMP
FOR EACH ROW
DECLARE
my_count number(4);
BEGIN
SELECT COUNT(u_uname)
FROM WEEKEND_UPDATE_OK INTO my_count
WHERE u_uname = user_name;
IF my_count=0 THEN
RAISE_APPLICATION_ERROR(20508,'Update not allowed');
END IF;
END;
引申:触发器分为事前触发和事后触发,这两者有什么区别?语句级触发和行级触发有什么区别?
事前触发发生在事件发生之前,用于验证一些条件或进行一些准备工作;事后触发发生在事件发生之后,做收尾工作。事前触发器可以获得之前和新的字段值,而事后触发可以保证事务的完整性。
语句级触发可以在语句执行之前或之后执行,而行级触发在触发器所影响的每一行触发一次。