日期:2014-05-16  浏览次数:20409 次

传智播客.net培训503数据库存储过程及触发器
学习了sql语句,以及ado.net和sqlhelper的几天学习后,今天是数据库课程的最后一天了。
主要介绍了连接池,存储过程和触发器,游标的使用。
在实际使用中,触发器因为要考虑很多因素,所以很少使用触发器,赵老师没有细说,
但是做了一个例子,虽然不常用,可是觉得触发器有的到时候应该可以提高效率
游标因为效率低下所以也不怎么使用。
存储过程很像编程中的方法调用。

存储过程就想数据库中运行方法(函数)
优点:
执行速度快--在数据库中保持的存储过程语句都是编译过的
允许模块化程序设计-类似方法的复用
提高系统安全性-防止sql注入
减少网络流量-只要传输存储过程名称

定义存储过程语法:
create proc 存储过程名
@参数1  数据类型 [= 默认值 OUTPUT], @参数n  数据类型 [= 默认值 OUTPUT]
    AS
  begin
        SQL语句
  end
执行:
exec 过程名【参数】

练习:
--编写一个存储过程,从MyStudent表中,查询出大于指定年龄的所有人的信息,
--并且返回所查询出的记录的条数
--使用带输出参数的存储过程
create proc usp_selectStudentsByAge
@uage int,
@jiLuTiaoShu int output --ouput表示该参数是一个输出参数(在存储过程中为该参数赋值,然后在存储过程外部可以通过该参数获取该值。)
as
begin
select * from myStudent where fage>@uage
set @jiLuTiaoShu=(select count(*) from mystudent where fage>@uage)
end
declare @ucount int
exec usp_selectStudentsByAge @uage=70,@jiLuTiaoShu=@ucount output
print '返回的总记录条数为:'+convert(varchar(10), @ucount)
--exec usp_selectStudentsByAge 20

触发器的作用:自动化操作,减少了手动操作及出错的几率
触发器是一种特殊类型的存储过程,它不同于一般的存储过程。
【在SQL内部把触发器看做是存储过程但是不能传递参数,不能手动调用】
一般的存储过程通过存储过程名称被直接调用,而触发器主要是通过事件进行触发而被执行。
触发器是一个功能强大的工具,在表中数据发生变化时自动强制执行。触发器可以用于SQL Server约束、默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能。
在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。

after触发器:在语句执行完毕后触发
instead of触发器:用来替换原本的操作,可以在约束被检查之前触发

触发器语法:
CREATE TRIGGER triggerName ON 表名
after(for)(for与after都表示after触发器)  |  instead of
UPDATE|INSERT|DELETE(insert,update,delete)
AS
begin

end

触发器的建议:
尽量避免在触发器中执行耗时操作,因为触发器会与SQL语句认为在同一个事务中。(事务不结束,就无法释放锁。)
避免在触发器中做复杂操作,影响触发器性能的因素比较多(如:产品版本、所使用架构等等),要想编写高效的触发器考虑因素比较多(编写触发器容易,编写复杂的高性能触发器难!)。
触发器编写时注意对多行触发时的处理。(一般不建议使用游标,性能问题!)

游标:
SQL语句是把结果集作为一个整体(整个作为一个单元)来操作的,但有时候我们需要针对结果集中的每条记录(或某部分记录)进行特殊操作,这时就需要用到游标。
多数情况下使用查询的性能要比使用游标高效,但并不是任何情况下使用查询性能都高于使用游标