储存过程:

存储过程是存储在数据库目录中的一段声明性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:表示数据库名称,可选参数,如果省略则表示从当前数据库中删除触发器。】

谢谢大家阅读,如果想要获取更多java基础知识,可以戳我一起交流学习!