数据库存储过程和触发器概述

存储过程综述

一、概念

数据库存储过程是一种数据库对象,是为了实现某个特定任务,将一组预编译的SQL语句以一个存储单元的形式存储在服务器上,供用户调用。存储过程在第一次执行时进行编译,然后将编译好的代码保存在高速缓存中以便以后调用,这样可以提高代码的执行效率。
数据库存储过程和触发器概述_第1张图片

二、存储过程的优点

与传统数据查询方式相比较,存储过程存在一下优点:

  1. 安全机制:只给用户访问存储过程的权限,而不授予用户访问表和视图的权限。
  2. 改良了执行性能:在第一次执行后,会在SQL server的缓冲区中创建查询树,以后执行无需编译。
  3. 减少网络流量:存储过程存在于服务器上,调用时只需传递执行存储过程的执行命令和返回结果。
  4. 模块化的程序设计:增强了代码的可重用性,提高了开发效率。

存储过程同其他编程语言中的过程相似,有如下特点:

  1. 接受输入参数并以输出参数的形式将多个值返回至调用过程或批处理。
  2. 包含执行数据库操作(包括调用其它过程)的编程语句。
  3. 向调用过程或批处理返回状态值,以表明成功或失败(以及失败原因)。

三、存储过程类型

  1. 系统存储过程

    系统存储过程存储在master数据库中,并以sp_为前缀,主要用来从系统表中获取信息,为系统管理员管理SQL Server提供帮助,为用户查看数据库对象提供方便。

  2. 本地存储过程
    本地存储过程是用户根据需要,在自己的普通数据库中创建的存储过程。

  3. 临时存储过程
    临时存储过程通常分为局部临时存储过程和全局临时存储过程。创建局部临时存储过程时,要以“#”作为过程名称的第一个字符。创建全局临时存储过程时,要以“##”作为过程名称的前两个字符。

  4. 远程存储过程
    远程存储过程是SQL Server 2000的一个传统功能,是指非本地服务器上的存储过程。

  5. 扩展存储过程
    扩展存储过程以xp_为前缀,它是关系数据库引擎的开放式数据服务层的一部分,其可以使用户在动态链接库(DLL)文件所包含的函数中实现逻辑,从而扩展了Transact-SQL的功能,并且可以象调用Transact-SQL过程那样从Transact-SQL语句调用这些函数。

触发器综述

一、概念

触发器是一种特殊类型的存储过程,不由用户直接调用,而且可以包含复杂的 SQL语句。它们主要用于强制复杂的业务规则或要求。触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。
其显著的的特点:

  1. 它与表紧密相连,可以看作表定义的一部分;
  2. 它不能通过名称被直接调用,更不允许带参数,而是当用户对表中的数据进行修改时,自动执行;
  3. 可以用于SQL Server约束、默认值和规则的完整性检查,实施更为复杂的数据完整性约束。

二、触发器的优点

  1. 触发器自动执行:在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。
  2. 触发器能够对数据库中的相关表实现级联更改
  3. 触发器可以实现比CHECK约束更为复杂的数据完整性约束
  4. 触发器可以评估数据修改前后的表状态,并根据其差异采取对策。
  5. 一个表中可以存在多个同类触发器(INSERT、UPDATE或DELETE),对于同一个修改语句可以有多个不同的对策以响应。

三、触发器的种类

按触发被被激活的时机可以分为两种类型
AFTER 触发器INSTEAD OF触发器

AFTER触发器又称为后触发器,该类触发器是在引起触发器执行的修改语句成功完成之后执行。如果修改语句因错误(如违反约束或语法错误)而失败,触发器将不会执行。此类触发器只能定义在表上,不能创建在视图上。可以为每个触发操作(INSERT、UPDATE或DELETE)创建多个AFTER触发器。

INSTEAD OF触发器又称为替代触发器,当引起触发器执行的修改语句停止执行时,该类触发器代替触发操作执行。该类触发器既可在表上定义,也可在视图上定义。对于每个触发操作(INSERT、UPDATE和DELETE)只能定义一个INSTEAD OF触发器

特别介绍一下两张特殊的临时表:inserted表deleted表

这两张表都存在于高速缓存中。用户可以使用这两张临时表来检测某些修改操作所产生的效果。例如,可以使用SELECT 语句来检查INSERT和UPDATE语句执行的插入操作是否成功,触发器是否被这些语句触发等。但是不允许用户直接修改inserted表和deleted表中数据。

deleted表中存储着被DELETE和UPDATE语句影响的旧数据行。在执行DELETE和UPDATE语句过程中,指定的数据行被用户从基本表中删除,然后转移到了delete表中。一般来说,在基本表中delete表中不会存在有相同的数据行。

inserted表中存储着被INSERT 和UPDATE语句影响的新的数据行。当用户执行INSERT 和UPDATE语句时,新的数据行被添加到insert表中,同时这些数据行的备份被复制到inserted临时表中。

一个典型的UPDATE事务实际上是由两个操作组成。首先,旧的数据行从基本表中转移到delete表中,前提是这个过程没有出错;紧接着将新的数据行同时插入基本表和insert表。

你可能感兴趣的:(sql)