CREATE TRIGGER employee_insupd
ON employee
FOR insert, UPDATE
AS
--Get the range of level for this job type from the jobs table.
declare @min_lvl tinyint,
   @max_lvl tinyint,
   @emp_lvl tinyint,
   @job_id smallint
select @min_lvl = min_lvl,
   @max_lvl = max_lvl,
   @emp_lvl = i.job_lvl,
   @job_id = i.job_id
from employee e, jobs j, inserted i
where e.emp_id = i.emp_id AND i.job_id = j.job_id
IF (@job_id = 1) and (@emp_lvl <> 10)
begin
   raiserror ('Job id 1 expects the default level of 10.',16,1)
   ROLLBACK TRANSACTION
end
ELSE
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)
begin
   raiserror ('The level for job_id:%d should be between %d and %d.',
      16, 1, @job_id, @min_lvl, @max_lvl)
   ROLLBACK TRANSACTION
end这里写了这么多,程序中也要这样再来啊?

解决方案 »

  1.   

    也就是说,相同的事情要做两次?
    ------------------------------------------------
    当然!如果数据库段不保证一致性,你便过程需自然知道任何人都可以使用自己惯用的工具甚至直接使用osql之类直接修改后台数据,这时候作为系统开发人员没有理由将责任完全推给别人吧!如果客户端不检验,那么很多终究会“出错”的操作的响应很慢!何必呢?客户机的cpu执行几万条命令才需要多少时间,何必舍不得她而浪费网络和后台服务器的资源?
      

  2.   

    123456xjy(123456):
    比如上面的出錯信息:
    Job id 1 expects the default level of 10
    我如何在asp頁面裏面捕獲這個信息,提示用戶啊?
      

  3.   

    Jianli2004(健力)(MVP):
    我觉得后台的约束是肯定要的。
    前台也是要检查的,只是检查到什么程度而已,
    特别是外键关系比较多的时候,
    前台怎么检查啊?
      

  4.   

    w_rose(w_rose):就是說,比如輸入3000塊錢的工資,
    數據庫做了觸發器,來限制如果這個職位是工程師,
    系統可以保存進去。如果是清潔工,就不可以。
    前台錄入數據的時候是不是要檢查一下,如果是清潔工,就不可以錄入3000塊的工資。
    還是如你說的那樣,"如果客户端没有正确地检验,后台服务器最终还是能保证系统数据的一致性"
      

  5.   

    123456xjy(123456)我觉得还是第一位大侠说得对,你可以不在应用程序中进行检查。
    因为在数据库的表上建立触发器是为了保证不管用户使用哪种工具都能是数据是一致的,并且是正确的。不管你在应用程序中是否对相应的数据进行检查,触发器都会执行。因此建议你在应用程序中不再进行相应的检查,而是靠应用程序捕获相应的错误信息来加以提示用户。
    至于速度问题,我想使用触发器的速度恐怕比你在前端写代码来检查要快得多吧。这个比较有理﹐相同的事不需做两次﹐只要捕捉错误代码就可以了。至于如何捕捉错误代码﹐这个你可以在前台程序中使用 On error goto errHandle ﹐看一下所弹出的错误信息的代码﹐然后抄下来。呵呵﹐不知道这个方法是不是比较笨﹖
      

  6.   

    我觉得前台可以做一些非法字符的检验
    只是工资范围的话还是在后台检验吧,就如hdyd()所说的那种,前台就不好检验了.如果范围变了的话,前台改的话也不方便
      

  7.   


    大家的意思大多是,客戶端不可能做到檢查那麽完全。只能做一些簡單的判斷我如何在asp頁面裏面捕獲這個信息,提示用戶啊?Java裏面好像可以捕獲這個數據庫抛出的異常,提示給用戶。asp裏面怎樣寫啊?
      

  8.   

    on error goto Errorfound
    ...
    exit sub Errorfound:
    alert err.description,vbexclamation
    exit sub
    好多面没用过asp了。现在用asp.net。
      

  9.   

    如果你的asp代码是运行在后台的,你写一个“醒目地”显示错误信息的页面,然后在Errorfound后边将页面重定向到这个页面。
      

  10.   

    我认为程序应该执行检查。
    1、这是一个非常好的程序设计规范,
    在数据库中通过约束、触发器,强制保证在任何情况下数据的完整性、有效性,
    同时,在代码设计中完整的体现业务规则。
    则无论对于数据库结构设计,还是代码结构设计两方面来说,都形成完整、健壮的系统~~~2、从用户交互的角度,输入超出范围的数据,得到一个数据库直接给出的错误提示,就好比我们在操作windows的时候出现蓝屏那样,会令用户非常困惑(当然你也可以捕获sqlserver的错误,加以判断,然后给出恰当的消息,但这将比直接实现业务逻辑更加麻烦。)
    我认为,sqlserver本身给出的错误消息,应该是面向程序员的,
    比如,你强制业务规则的程序段出现逻辑错误而失效,就将会收到sqlserver给出的错误消息,然后你可以根据这个消息查找、修改程序的错误。3、反对检查两次的基本都是因为考虑性能原因,而实际上,两次检查并不会影响性能,反而会提高性能:
    假如输入错误数据,两次检查的话,直接在客户端就做出了判断,并做出相应的处理,就不需要将数据提交给服务器,服务器处理以后,再回滚事物,然后再返回(一个极端情况:假如你要提交大量数据,而其中只是某一个数据出错,会怎样?),这样的话肯定节约服务器资源和网络资源。
      

  11.   

    强烈赞同fuxc(Michael(闭关修炼ing)) 的观点!
      

  12.   

    同意w_rose(w_rose) 的做法!!
      

  13.   

    同意w_rose的说法,如果可以在客户端实现的判断
    毕竟比在sql-server端进行数据更新时发现
    不满足约束而回滚的过程要快的多,不是吗?