《高性能的》第四讲细节(2)

来源:互联网 发布:js 数组长度 获取 编辑:程序博客网 时间:2024/06/04 23:27
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
第四讲编程细节(下部分)

 1、触发器
 2、游标
 3、函数
 4、存储过程
 5、事务

---------------------
作者:懒虫#SapphireStudio.
欢迎访问我们的站点www.chair3.com
欢迎转载。
--------------------

  上次得到不少朋友的捧场,信心大增了:),决定趁着五一期间把它写完,反正外面非典厉害,也不好出去玩。这里讲到3、4、5了。

  这里决定把4与3调换一下,先讲解4(存储过程,以下用sp来简称;函数,以下用fn来简称)

4、存储过程。

 存储过程是数据库编程里面最重要的表现方式了。

 呵呵,这里我要提到上次说道的:我拒绝使用触发器。这里我要开始猛批一顿触发器了。

 在SQL2000里,说实话,我实在找不出触发器可以存在的理由。回忆一下:触发器是一种特殊的存储过程。它在一定的事件(Insert,Update,Delete等)里自动执行。我建议使用sp和级联来代替触发器。

 在SQL7里面,触发器通常用于更新、或删除相关表的数据,以维护数据的完整。SQL7里面,没有级联删除和级联修改的功能。只能建立起关系。既然SQL2000里面提供了级联,那么触发器就没有很好的存在理由。更多的情况下是作为一个向下兼容的技术而存在。

 当然,也有人喜欢把触发器作为处理数据逻辑,甚至是业务逻辑的自动存储过程。这种方法并不足取。这里列举以下使用触发器的一些坏处:

 a、“地下”运行。
   触发器没有很好的调试、管理环境。调试一段触发器,要比调试一段sp更耗费时间与精力。

 b、类似于goto语句。(过分自由的另外一个说法是:无政府主义!)
  一个表,可以写入多个触发器,包括同样forUpdate的10个触发器!同样forDelete的10个触发器。也就是说,你每次要对这个表进行写操作的时候,你要一个一个检查你的触发器,看看他们是做什么的,有没有冲突。
  或许,你会很牛B的对我说:我不会做那么傻B的事情,我记得住我做了些什么!3个月以后呢?10个月以后呢?你还会对我说你记得住么?
 c、嵌套触发器、递归触发器
  你敢说你这么多的触发器中不会存在Table1更新了Table2表,从而触发Table2表更新TAble3,TAble3的触发器再次触发Table1更新Table2……??
  或许还会发生这种情况:你的程序更新了Table1.Fd1,触发器立马更新Table1.fd1,再次触发事件,触发器再次更新Table1.fd1……

  当然,可以设置和避免应用程序进入死循环,可是,得到的结果,或许就不是你想要的。
 
 …… 
 我想不出触发器更多的坏处了,因为我早就抛弃了它。算了,不批它了,酸是各人爱好把!我建议使用完全存储过程来实现数据逻辑和事务逻辑!

 先讲讲sp的编写格式(我个人的编程习惯)。良好的习惯有助于日后的维护。


  CreateProcspBuyBook(          --@@存储过程头,包括名字、参数、说明文档
   @iBookIDint,   --书的ID       --@@参数
   @iOperatorIDint --操作员ID
  )
  -------------------------------------------------------  @@说明文档
  --Name : spBuyBook                   @@名字   
  --func : 购买一本书的业务逻辑              @@存储过程的功能           
  --Return: 0,正确;-1,没找到该书;-2,更新Book表出错;-3..... @@返回值解释
  --Use : spDoSomething,spDoSomething2....        @@引用了那些外部程序,比如sp,fn,vw等
  --User : 懒虫                      @@该存储过程的使用者
  --Author: 懒虫#SapphireStudio(www.chair3.com)     @@作者
  --Date : 2003-5-4                    @@最后更新日期1

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>