5.3 存储过程
SQL Server 使用存储过程来避免远程发送并执行SQL代码带来的安全隐患,本节主要介绍存储 过程的概念和使用方法。
5.3.1为什么需要存储过程
当今的软件大多应用于网络中,而一般应用程序所运用的数据保存在数据库中,在没有使用存 储过程的数据库应用程序中,用户大多从本地计算机客户端(Client)通过网络向服务器端(Server) 发送SQL代码编写的请求,服务器端对接收到的SQL代码进行语法编译后执行,并将执行结果传送 回客户端,再由客户端的应用软件处理后输出,如果开发者对服务器的安全性考虑不全面,就会为 黑客提供盗取数据的机会。图5.8给出了一个简单的SQL注入过程
未经授权的攻击者在网络中截取用户向服务器发送的SOL代码,改写后的恶意SOL代码提交到 服务器编译并执行,最后攻击者就比较容易地获得他所需要的数据。
从图5.8中,我们可以看到应用程序执行的过程是不安全的,主要问题在于以下几个方面。
> 数据不安全。网络传送SOL代码,容易被未授权者截获。
> 每次提交SQL代码都要经过语法编译后再执行,影响应用程序的运行性能。
> 网络流量大。对于反复执行的相同SQL代码,将会在网络上多次传送,增加网络传输量。
为了解决以上问题,我们可以采用存储过程把对数据库操作的SQL代码预先编译好并保存在服 务器端。用户只需在本地机上输入要执行的存储过程名称和必要的数据就可以直接调用执行存储过 程完成相关的操作。这样,既减少了网络传输量,又能保证应用程序的运行性能,同时也防止了未 经授权的攻击者想截取SQL代码的行为。
5.3.2什么是存储过程
存储过程是SQL语句和控制语句的预编译集合,保存在数据库中,可由应用程序调用执行,而且 允许用户声明变量、逻辑控制语句及其他强大的编程功能。
存储过程可包含逻辑控制语句和数据操纵语句,可以接收参数、输出参数、返回单个或多个结果集及返回值。
使用存储过程有下列优点。
1.模块化程序设计
只需创建一次存储过程并将其存储在数据库中,以后即可在程序中调用该存储过程任意次。存储过程可由数据库编程方面的专业人事创建,并可独立于程序源代码而单独修改。
2.执行速度快,效率高
如果某操作需要大量的 T-SQL 代码或需要重复执行,存储过程将比 T-SQL 批处理代码的执行速度要快。SQL Server 在创建存储过程时对其代码进行分析和优化,并可在首次执行该存储过程后使用该存储过程的内存中的版本。此后每次调用已经创建的存储过程时,直接执行不再需要编译优化,可以提高程序的运行性能。但如果使用 T-SQL 批处理代码,每次运行 T-SQL 语句时,都要从客户端重复发送,并且在SQL Server 每次执行这些语句时,都要对其进行编译和优化。
3.减少网络流量
创建使用存储过程后,一个需要数百行T-SQL代码的操作,由一条执行存储过程代码的单独语句就可实现,而不需要再网络中发送数百行代码。
4.具有良好的安全性
即使对于没有直接执行存储过程中语句的权限的用户,也可授予他们执行该存储过程的权限。 不同权限的用户使用不同的存储过程,另外,存储过程保存在数据库中,用户只需提交存储过程名 称就可以直接执行.避免了攻击者非法截取SQL代码获得用户数据的可能性。
存储过程分为以下两类。
> 系统存储过程(System Stored Procedures)。
> 用户自定义的存储过程(User-defined Stored Procedures)。
5.3.3系统存储过程
SQL Server提供系统存储过程,它们是一组预编译的T-SOL语句。系统存储过程提供了管理数据库和更新表的机制,并充当从系统表中检索信息的快捷方式。
通过配置SQL Server,可以生成对象、用户、权限的信息和定义,这些信息和定义存储在系统 表中,每个数据库分别有一个包含配置信息的系统表集,用户数据库的系统表是在创建数据库时自 动创建的,用户可以通过系统存储过程访问和更新系统表。
1.常用系统存储过程
**SQL Server 的系统存储过程的名称以"sp_"开头,并存放在Resource数据库中,系统管理员拥有这些存储过程的使用权限。**可以在任何数据库中运行系统存储过程,但执行的结果会反映在当前数据库中。
表5-1列出了一些常用的系统存储过程,
实验案例四
查看clss数据库的信息。
exec sp_helpdb
查询结果
查看clss数据库中可查询的表或视图的信息。
exec sp_tables
查询结果
查看 clss数据库中 Student 表的约束。
exec sp_helpconstraint xueyuan
查询结果
查看clss数据库中Student表的索引。
exec sp_helpindex chengji
查询结果
查看clss数据库中的所有存储过程。
exec sp_stored_procedures
查询结果
查看在实验案例三中创建的触发器的实际文本。
exec sp_helptext reminder
查询结果