乐趣区

关于数据库:数据库储存过程与触发器

贮存过程:

存储过程是存储在数据库目录中的一段申明性 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 基础知识,能够戳我一起交流学习!

退出移动版