先来看两段sql语句。
前一段时间看牛腩老师的新闻发布系统,看到存储过程和触发器的时候,之隐隐约约觉得这是两个功能强大的类似function的东西,却又具体说不上他们有何区别,有何不同。上代码:
查微软msdn:
-
触发器
触发器是一种特殊类型的存储过程,它在您使用一种或多种数据修改操作(UPDATE、INSERT 或 DELETE)来修改指定表中的数据时运行。
触发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制服从复杂的业务规则或要求。例如,您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用表设计器,则可以在表之间创建关系以自动创建外键约束。
优点:
触发器是自动的。它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。
触发器可以通过数据库中的相关表进行级联更改。
触发器可以强制限制,这些限制比用约束所定义的更复杂,触发器可以引用其他表中的列。
=
存储过程
存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可通过来自应用程序的调用来执行,并且允许用户声明的变量、条件执行以及其他强大的编程功能。
存储过程可以包含程序流、逻辑关系和对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
优点:
可以在单个存储过程中执行一系列 SQL 语句。
可以从您的存储过程内引用其他存储过程,这可以简化一系列复杂语句。
存储过程于创建时在服务器上进行编译,所以执行起来比单个 SQL 语句快。
=
比较:
触发器之于存储过程,就像事件之于方法。方法包括事件、属性和方法,事件、属性是特殊的方法。触发器是特殊的存储过程,它不由用户直接调用,而是与数据库表紧密相连,当用户修改表中的数据时,它自动执行。
存储过程是一组为了完成特定功能Transact-SQL 语句,我们可以将一个复杂的操作过程放置其中,它们只需编译一次,以后即可多次执行。因为 Transact-SQL 语句不需要重新编译,所以执行存储过程可以提高性能。存储过程需要调用执行。