大家好,今天是我第一次在CSDN上论坛上提问自己的问题。希望各位高手,老鸟帮帮忙,帮我解决一下这个问题。   本人有个习惯,喜欢写存储过程而不喜欢直接在数据层上写SQL语句。这主要是与我之前所接受的教育有关,因为我以前的老师教导我们说,这样的好处是除了可以防止SQL注入攻击外,最主要的还是执行的速度快,存储过程是预编译的,执行起来比SQL语句快,至于快多少,效率高多少,本人也没有去实践探索过。我接触的都是一些小公司,项目基本上就是你实现这个功能就行,你怎么写都无所谓。我的同事,他们有的人偏向用存储过程,也有些人偏向用SQL语句。他们都有他们的理由。偏好SQL语句的,当然就是因为方便,只要用到什么操作就可以根据情况写SQL语句就行了。我也向他们请教过这个问题,但他们也没有一个很好的答案。
  假如有用户表,它有个标识ID,主键。另外有一个字段是用户名,要求是唯一的。我以前的做法是,用户要求唯一性的字段,我可以加一个Unique约束,然后在插入的存储过程中用业务逻辑去判断当前的字段有没有相同的值,如果没有就插入,如果有就返回错误。这样的话,无论是通过程序还是通过数据库管理直接插入数据都会插入正确格式的数据。而现在是,我把约束业务逻辑数据写到了触发器里,然后插入的操作语句就只剩下一个Insert语句了,那我还要不要把INSERT写成存储过程?这样做是不是多余了?
  写得有点乱,其实我的问题可以概括为:什么时侯用SQL语句,什么时侯用存储过程。什么时侯用约束?什么时侯用触发器?

解决方案 »

  1.   

    个人看法,仅供参考:
    1:比较简单的查询或者需要根据用户选择附加条件的时候,多用sql语句,对表或视图进行查询;
    2:比较复杂的业务逻辑及复杂的报表多用存储过程实现,
    3:约束,主键肯定是要有的,可以提高查询速度,check用来限制输入到列中的值,有需要的时候才用
    4:触发器是一种特殊的存储过程,尽量少用,但在维护数据一致性或数据反馈时,可以简化处理,也会用,
    比如主从表,删除主表数据,连带删除从表数据,但在触发器中最好不要非常复杂的业务逻辑
    实际上很多功能可以用多种方式实现,主要看效率及性能,看具体情况而定.
      

  2.   

    什么时侯用SQL语句,什么时侯用存储过程。什么时侯用约束?什么时侯用触发器?
    简单的查询就用SQL语句存储过程可以用来实现比较复杂一点的逻辑,在程序中也比较方便调用约束则视情况而定,有需要的时候可以用触发器有安全隐患,能不用就尽量不用
      

  3.   

    http://topic.csdn.net/u/20110218/15/4c5f0fe6-ce49-4c39-9e1b-0df378618d7a.html?68758
      

  4.   

    直接select:适用于业务逻辑简单,单表较少列、数据量少的查询
    存储过程:适用于业务逻辑复杂,比较耗时的操作,例如:大批量查询、增删改等。
    触发器:适用于特定业务逻辑,例如:当表中某列或几列满足条件而触发的业务逻辑。
      

  5.   

    我个人觉得优先使用过程,
    有两个优点:一个是预编译,再一个可以适应业务需求的变化,只要改过程内部逻辑,而无须修改程序(如果是SQL语句,就苦了.)
    触发器:则尽量少用.
    对于数据有些特殊的要求,如果非空,唯一,则可以加入一些约束来方便管理
      

  6.   

    数据表里应该有的:
    主键/索引/默认值数据表里可以有,但只是作为完整性检验最后一道关口的(换句话说,即使没有,只要你的业务处理层足够坚强,它实际上是用不到的):
    唯一性键/关系/CHECK约束/NULL值
    缺陷是:出了问题,数据库不知道把错误告诉谁,除非你的程序里写一大堆try.数据表里最好不用的:
    触发器(除非一定得用 inserted 表 和 deleted 表,或者非得用 INSTEAD OF 触发器)
    缺陷是:由于它是在对表数据操作时实时进行的,inserted表和deleted表的内容在触发器表中实际上是处于X锁状态,此时如果你唠唠叨叨在触发器里写一大堆东西,后果你应该能想象到.
    当然,正因为它对记录采取锁住的状态,会避免读写脏数据,正如在存储过程中进行某种判断,判断完了再去作更新的时候,数据库状态被他人改了,当然,你也可以在存储过程必要的地方加锁,这正是存储过程的灵活性所在.业务逻辑写在哪里:
    存储过程里最佳,方便灵活高效安全,可以分别与表和客户端打交道,作为一个中继站,但.
    应用程序后台直接处理,也行,当有些逻辑不方便弄到数据库里时比较好,或者要使用比较复杂的算法,用SQL效率不高时用.在应用程序里最应该避免写的是:
    查询,对记录集进行循环处理,在循环处理里再来一个查询.令人毛骨悚然的是,有的人还会再来一个循环然后再在循环里来一个查询!本人最讨厌的写法:
    rs.update
    用脚趾头想想, 也会知道它与单单执行update...where... 相比是地狱与天堂之比.