存储过程可加快查询的执行速度,提升访问数据的速度,帮助实现模块化编程,保存一致性,提升安全性。触发器是在对表进行插入、更新、删除操做时自动执行的存储过程,一般用于强制业务规则。sql
1、存储过程
shell
1. 为何须要存储过程数据库
从客户端经过网络向服务器发送SQL代码并执行是不安全的,给***提供盗取数据的机会,以下图所示,一个简单的SQL注入过程编程
从上图可知,应用程序的执行过程是不安全的,主要有如下几个方面:
安全
(1)数据不安全,网络传送SQL代码,容易被未受权者截获bash
(2)每次提交SQL代码都要通过语法编译后在执行,影响应用程序的运行性能服务器
(3)网络流量大,对于反复执行的SQL代码,在网络上屡次传送,影响网络传输量网络
2. 什么是存储过程编程语言
存储过程是SQL语句和控制语句的预编译集合,保存在数据库中,可有应用程序调用执行,并且容许用户声明变量、逻辑控制语句及其余强大的编程功能。包含逻辑控制语句和数据操做语句,能够接收参数、输出参数、返回单个或多个结果值及返回值ide
使用存储过程的优势:
(1)模块化程序设计,只需建立一次,之后便可调用该存储过程任意次
(2)执行速度快,效率高
(3)减小网络流量
(4)具备良好的安全性
存储过程分为系统存储过程和用户自定义的存储过程
3. 系统存储过程
是一组预编译的T-SQL语句,提供了管理数据库和更新表的机制,并充当从系统表中检索信息的快捷方式
(1)常见的系统存储过程
系统存储过程的名称以“sp_”开头,存放在Resource数据库中
使用存储过程的语法以下:
exec 存储过程名 [参数值]
例如:执行如下T-SQL语句
(2)经常使用的扩展存储过程
扩展存储过程是SQL Server提供的各种系统存储过程的一类,容许使用其余编程语言(如C#)建立外部存储过程,一般以“xp_”开头,以DDL形式单独存在
一个经常使用的扩展存储过程为xp_cmdshell ,它能够完成DOS命令下的一些操做,如建立文件夹、列出文件夹。语法以下:
exec xp_cmdshell DOS命令 [no_output]
其中,no_output为可选参数,设置执行DOS命令后是否输出返回信息
例如:在C盘下建立一个文件夹bank,并查看文件
4. 用户自定义的存储过程
除了使用系统的存储过程外,也能够建立本身的存储过程。可使用SSMS或T-SQL语句建立存储过程
(1)使用SSMS建立存储过程
(2)使用T-SQL语句建立存储过程
建立存储过程的语法以下:
删除存储过程的语法以下:
drop proc 存储过程名
案例:有如下两个表,编写存储过程,实现网络管理专业的平均分
触发器
触发器是一种特殊的存储过程,当表中数据发生更新时自动调用,以响应INSERT、UPDATE、DELETE语句
1. 什么是触发器
触发器是对表进行插入、更新、删除操做时自动执行的存储过程,一般用于强制业务规则,能够定义比用CHECK约束更为复杂的约束。触发器主要是经过事件触发而被执行的,而存储过程能够经过存储过程名称而被直接使用。
2. 触发器的分类
INSERT触发器:当向表中插入数据时触发
UPDATE触发器:当更新表中某列或多列时触发
DELETE触发器:当删除表中记录是触发
3. deleted表和inserted表
每一个触发器都有两个特殊的逻辑表:删除表和插入表。由系统管理,存储在内存而不是数据库中,所以,不容许用户直接对其修改。它们只是临时存放对表中数据行的修改信息,当触发器工做完成,它们也被删除。
4. 触发器的做用
主要做用是:实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性,除此以外,还有如下几种功能
(1)强化约束:实现比CHECK约束更为复杂的约束
(2)跟踪变化:侦测数据库内的操做,从而不容许未经许可的更新和变化
(3)级联运行:侦测数据库内的操做,并自动级联影响整个数据库的各项内容
5. 建立触发器
建立触发器可以使用SSMS或T-SQL语句
(1)使用SSMS建立触发器
(2)使用T-SQL语句建立触发器
使用T-SQL语句建立触发器的语法以下:
create trigger 触发器名 //建立的触发器名称 on 表名 //在其上执行触发器的表或视图名称 [with encryption] //可选,防止将触发器做为SQL Server复制的一部分发布 for {[delete,insert,update]} //关键字,至少指定一项,若是多项,由逗号分隔 as sql语句
案例:建立一个触发器,当有人更改信息时,提示一条消息,并阻止操做
若是须要修改触发器,操做方法以下,在弹出的窗口修改T-SQL语句便可
建立触发器时注意事项
(1)create trigger必须是批处理中的第一条语句,并只能应用到一个表中
(2)触发器只能在当前数据库中建立,但能够引用当前数据库的外部对象
(3)在同一条create trigger语句中,能够为多种用户操做(如DELETE)定义相同的触发器操做