数据库:储存过程与触发器
储存过程:
存储过程是存储在数据库目录中的一段声明性SQL语句。 存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数来执行它。
存储过程的优点:
① 增强了SQL语句的功能和灵活性;
② 不需要反复建立一系列处理步骤,保证了数据的完整性;
③ 降低了网络的通信量,客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL语 句相比自然数据量少了很多;
④ 增强了使用的安全性,通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而 保证数据的安全;
⑤ 可以实现集中控制,当规则发生改变时,只需要修改存储过程就可以啦;
存储过程的缺点:
① 调试不是很方便
② 可能没有创建存储过程的权利
③ 重新编译问题
④ 移植性问题
存储过程的分类:
1)系统存储过程:
以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。
2)本地存储过程:
用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。
3)临时存储过程:
①局部临时存储过程
以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;
②全局临时存储过程
以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。
4)远程存储过程:
在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。
5)扩展存储过程:
扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头
创建存储过程的参数:
procedure_name :存储过程的名称,在前面加#为局部临时存储过程,加##为全局临时存储过程。
number:是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。
parameter:存储过程的参数。可以有一个或多个。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。
data_type:参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。
VARYING: 指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。
default: 参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。
OUTPUT :表明参数是返回参数。
RECOMPILE:表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。
ENCRYPTION:表示 SQL Server 加密 。
FOR REPLICATION :指定不能在订阅服务器上执行为复制创建的存储过程。
AS :指定过程要执行的操作。
sql_statement :过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。
调用存储过程:
1)创建存储过程:
Create PROCEDURE 储存过程名称 (参数列表)
begin
过程体
end;
例:
创建储存过程:
create procedure porcedureName ()
begin
select name from user;
end;
2)调用存储过程:
call 储存过程名称
例:
call porcedureName();
3)删除储存过程:
DROP PROCEDURE 储存过程名称
触发器:
触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程。触发器是指一段代码,当触发某个事件时,自动执行这些代码。
触发器作用:
(1) 强化约束(Enforce restriction)
能够实现比CHECK 语句更为复杂的约束。
(2) 跟踪变化(Auditing changes)
可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
(3) 级联运行(Cascaded operation)
可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
(4) 存储过程的调用(Stored procedure invocation)
为了响应数据库更新,触发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS(数据库管理系统)本身之外进行操作。
触发器的限制:
1)触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL语句,但是允许存储程序通过参数将数据返回触发程序,也就是存储过程或者函数通过OUT或者INOUT类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程;
2)不能再触发器中使用以显示或隐式方式开始或结束事务的语句;
创建触发器:
(1)创建只有一条执行语句的触发器
语法结构如下:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_stmt
trigger_name:用户自定义的触发器名称;
trigger_time:标识触发事件,可以指定为before(时间发生前执行)或after(事件发生后执行);
trigger_event:标识触发事件,包括INSERT、UPDATE、DELETE;
table_name:触发器建立在哪个表上;
trigger_stmt:触发器执行语句。
(2)创建有多个执行语句的触发器
语法结构如下:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW
BEGIN
语句执行列表
END
【当触发器有至少一条的执行语句时,多条执行语句需要用BEGIN和END包裹,分别表示整个代码块的开始和结束。】
查看触发器:
show triggers;
删除触发器:
DROP TRIGGER [schema_name] trigger_name;
【schema_name:表示数据库名称,可选参数,如果省略则表示从当前数据库中删除触发器。】