存储器
1.概述
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。存储过程可以包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或者多个结果集以及返回值。
2.存储过程分类
①系统存储过程
以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。
sp_who/sp_helpdb/sp_monitor
②本地存储过程
用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。
③临时存储过程
分为两种存储过程:
一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;
二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。
④远程存储过程
在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。
⑤扩展存储过程
扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。
3.创建存储
语法格式:
Create procedure procedure_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解释:
output:表示此参数是可传回的
with {recompile|encryption}
recompile:表示每次执行此存储过程时都重新编译一次
encryption:所创建的存储过程的内容会被加密
调用存储过程:
基本语法:exec sp_name [参数名]
删除存储过程:
基本语法:drop procedure sp_name
修改存储过程:
ALTER PROCEDURE procedure_name
with
FOR REPLICATION
AS
sql_statement
实例分析
create procedure proc_student #创建存储过程
@sex varchar(10)
AS
select * from 学生信息 where 性别=@sex #将性别作为新定义的变量列
exec proc_student @sex="男" #调用性别为男的存储过程
嵌套存储过程
alter proc get_calssinfo #修改存储过程
as
select * from 班级信息 #班级信息为第一层
exec get_student '男'
print @@NESTLEVEL #得出嵌套级数
exec get_calssinfo #学生信息为第二层
触发器
1.什么是触发器?
触发器是一个在修改指定表中的数据时执行的存储过程。经常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性或一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以此确保数据的完整性。
触发器不同于我们说的存储过程,触发器主要是通过事件进行触发而被执行的。而存储过程可以通过存储过程名字而被直接调用。
2.分类
- DDL触发器
- 当服务器或者数据库中发生数据定义语言(DDL)事件时,将被调用,如果要执行以下操作,可以使用DDL触发器。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时执行,我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。 - DML触发器
DML,数据操作语言,当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行。DML触发器的主要作用在于强制执行业 务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。
3.语法
DML语法格式:
CREATE TRIGGER trigger_name
ON{table|view}
{
{{FOR|INSERT|UPDATE|DELETE}}
AS
sql_statement
}
DDL触发器:
语法格式:
CREATE TRIGGER trigger_name
ON {all server|database}
WITH ENCRYPTION
{FOR|AFTER|{event_type}
AS
sql_statement
}
实例分析
DML
create trigger T_addnum
on 学生信息
for insert/delete/update
as
update 班级信息 set 班级人数=班级人数+1
where 班级编号=(select 所属班级 from inserted)
DDL
create trigger T_notdelete
on database
for Drop_table,alter_table
AS
PRINT '事务不能被处理,基础数据表不能被修改和删除!'
ROLLACK
嵌套触发器
create trigger t_del
on 新员工信息
for delete
as
insert into 员工信息(员工编号,员工姓名,所在部门编号,所任职位,性别)
select 员工编号,员工姓名,所在部门编号,所任职位,性别
from deleted
#在新员工信息表中删除一条信息的时候,在员工信息表中会插入一条对应的信息