存储过程的触发器

 我来答
K妖熃憰S
2016-05-10 · TA获得超过103个赞
知道答主
回答量:179
采纳率:100%
帮助的人:121万
展开全部

触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如Update、 Insert、 Delete 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
(1) 强化约束(Enforce restriction)
触发器能够实现比CHECK 语句更为复杂的约束。
(2) 跟踪变化Auditing changes
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
(3) 级联运行(Cascaded operation)。
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
(4) 存储过程的调用(Stored procedure invocation)。
为了响应数据库更新,触发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS(数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(Insert、 Update、 Delete)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。 SQL Server 2000 支持两种类型的触发器:AFTER 触发器和INSTEAD OF 触发器。其中AFTER触发器即为SQL Server 2000 版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(Insert Update Delete) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。
INSTEAD OF触发器表示并不执行其所定义的操作(Insert、 Update、 Delete),而仅是执行触发器本身。既可在表上定义INSTEAD OF触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。 Create procedure procedure_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解释:
output:表示此参数是可传回的
with {recompile|encryption}
recompile:表示每次执行此存储过程时都重新编译一次
encryption:所创建的存储过程的内容会被加密
如:
表book的内容如下
编号 书名 价格
001 C语言入门 $30
002 PowerBuilder报表开发 $52
实例1:查询表Book的内容的存储过程
create proc query_book
as
select * from book
go
exec query_book
实例2:
加入一笔记录到表book,并查询此表中所有书籍的总金额 Create proc insert_book@param1char(10),@param2varchar(20),@param3money,@param4moneyoutputwith encryption---------加密asinsert into book(编号,书名,价格)Values(@param1,@param2,@param3)select @param4=sum(价格) from bookgo执行例子:declare @total_price moneyexec insert_book '003','Delphi控件开发指南',$100,@total_price outputprint '总金额为'+convert(varchar,@total_price)go存储过程的3种传回值:
1)、以Return传回整数
2)、以output格式传回参数
3)、Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。
实例3:
设有两个表为Product,Order_,其表内容如下:
Product
产品编号 产品名称 客户订数
001 钢笔 30
002 毛笔 50
003 铅笔 100
Order_
产品编号 客户名 客户订金
001 南山区 $30
002 罗湖区 $50
003 宝安区 $4
请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中
代码如下:
Create proc temp_sale
as
select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额
into #temptable from Product a inner join Order_ b on a.产品编号=b.产品编号-----此处要用别名
if @@error=0
print 'Good'
else
print 'Fail'
go

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
野人无事不言L
2016-05-10 · TA获得超过1414万个赞
知道顶级答主
回答量:2242万
采纳率:0%
帮助的人:146.4亿
展开全部
所谓存储过程,是一组预编译的Transact-SQL语句,存储在SQL Server中,被作为一种数据库对象保存起来。存储过程的执行不是在客户端而是在服务器端(执行速度快)。存储过程可以是一条简单的Transact-SQL语句,也可以是复杂的Transact-SQL语句和流程控制语句的集合。 在使用Transact-SQL语言编程的过程中,我们可以将某些需要多次调用的实现某个特定任务的代码段编写成一个过程,将其保存在数据库中,并由SQL Server服务器通过过程名来调用它们,这些过程就叫做存储过程(也称为子程序)。 存储过程在第一次执行时进行语法检查和编译,编译好的版本存储在高速缓存中,用于后续调用,下次调用时可以直接执行。 存储过程的特点: 存储过程可以接受输入参数,并且可以用输出参数的形式返回值。存储过程可以包含复杂的流控制语句。 存储过程建立好以后可以被反复调用。一个存储过程可以调用另一个存储过程,嵌套调用可多达32级。 由于存储过程在建立和第一次执行的时候被解析、优化、编译和缓存(驻留在高速缓冲存储器中),因此其执行速度比直接向SQL Server发送T-SQL语句快。 存储过程的执行是通过一条语句来完成的,避免了网络上服务器和客户机之间大量Transact-SQL语句的传送,降低了网络的通信量。 存储过程可以被看作一种安全机制,即使用户没有对表或视图的访问权限,他们也可以被授予执行对表或视图进行访问的存储过程的权限。 、、、、、、、、、、、、、、、、、、、、、、、、、、、 触发器的作用 在指定的表中数据发生变化时被调用以响应INSERT、UPDATE或DELETE事件。 用于保护表中的数据,当有操作影响到触发器保护的数据时,触发器自动强制执行业务规则。 利用触发器可以方便地实现数据库中的数据完整性。 一般的存储过程通过存储过程名称被直接调用,而触发器主要是通过事件进行触发而被执行(对表或视图发出update、insert、delete语句)。 触发器是一个功能强大的工具,它与表格紧密相连,在表中数据发生变化时自动强制执行。触发器可以用于SQL Server约束、默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能。 触发器的优点 触发器是自动的执行的(往表里插入、修改、删除时被自动激活,从而防止对数据的不正确修改)。 触发器是基于一个表创建的,但可以针对多个表进行操作,实现数据库中的相关表进行层叠更改。 触发器可以实现比 check约束更为复杂的数据完整性约束。 一个表中可以同时存在三个不同操作的触发器,对于同一个修改语句可以有多个不同的对策以响应。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式