zoukankan      html  css  js  c++  java
  • 递归触发器引起的异常

    USE   master  
      go  
       
      create   database   DEPTLISTS  
      ON  
      (NAME=DEPTLISTS_DAT,  
      FILENAME='F:\My   Files\vb\P237\DEPTLISTS_DAT.MDF')  
      LOG   ON  
      (NAME=DEPTLISTS_LOG,  
      FILENAME='F:\My   Files\vb\P237\DEPTLISTS_LOG.LDF')  
      GO  
       
      use   DEPTLISTS  
      go  
       
      CREATE   TABLE   DEPTL  
      (lngDeptID   INT,lngFatherID   INT,strDeptName   char(10))  
      go  
       
      begin   tran  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(1,0,'北京部')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(2,0,'上海部')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(3,0,'广州部')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(4,1,'海淀分部')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(5,1,'朝阳分部')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(6,1,'西城分部')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(7,2,'静安分部')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(8,2,'黄埔分部')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(9,4,'知春路部门')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(10,4,'北外分部门')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(11,3,'a')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(12,11,'b')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(13,12,'c')  
      insert   into   DEPTL(lngDeptID,lngFatherID,strDeptName)   values(14,13,'d')  
      go  
      commit   tran  
       
      select   *   from   DEPTL  
      go  
       
      CREATE   TRIGGER   mydel   ON   [dbo].[DEPTL]    
      FOR     DELETE    
      AS  
      delete   from   deptl   where   lngFatherid=(select   lngdeptid   from   deleted)  
      go  
       
      delete   from   deptl   where   strDeptName='a'  
      go  
       
      我创建了一个数据库,添加了一些数据。我想实现递归的删除。比如删除strDeptName='a'的一条数据的时候,由触发器触发删除其它数据中lngFatherid与所删除一条数据中lngDeptid   相等的一条数据。在数据库我用了递归触发器。希望级连删除strDeptName='b'   ,strDeptName='c'   ,strDeptName='d'这几条数据。    
       
      结果报错:  
       
      服务器:   消息   217,级别   16,状态   1,过程   mydel,行   6  
      超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为   32)。  




    1.错误提示已经很清楚了,触发器的确递归的最大层数是32层,而你的数据中,要删除数据的递归关系已经超过了32层  
       
      2.楼主的触发器不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况

    --楼主可以这样写触发器(不用递归)  
       
      CREATE   TRIGGER   mydel   ON   [dbo].[DEPTL]    
      FOR     DELETE    
      AS  
      select   a.lngdeptid   into   #t   from   [dbo].[DEPTL]   a,deleted   d    
      where   a.lngFatherid=d.lngdeptid  
      while   @@rowcount>0  
      insert   #t   select   a.lngdeptid   from   [dbo].[DEPTL]   a,#t   d    
      where   a.lngFatherid=d.lngdeptid   and   not   exists(  
      select   *   from   #t   where   lngdeptid=a.lngdeptid)  
      delete   a   from   deptl   a,#t   d   where   a.lngdeptid=d.lngdeptid  
      go
  • 相关阅读:
    执行插件的替代方式:用JS调用操作
    查找字段的筛选-使用addCustomView
    Dynamics CRM 中Web API中的深度创建(Deep Insert)
    使用JS通过Web API执行批量操作,多个操作是一个事务!
    使用Dynamics 365 CE Web API查询数据加点料及选项集字段常用查询
    配置Postman通过OAuth 2 implicit grant获取Dynamics 365 CE Online实例的Access Token
    Dynamics 365 Customer Engagement中使用JavaScript和C#调用操作Action示例
    Dynamics 365 We API ODATA语法根据父记录查询子记录,根据子记录查询父记录(附上根据团队,队列名称查成员)
    Dynamics 365 Online通过OAuth 2 Client Credential授权(Server-to-Server Authentication)后调用Web API
    控制台程序(C#)不弹出登录窗口连接到Dynamics CRM Online的Web API
  • 原文地址:https://www.cnblogs.com/dadamoney/p/692210.html
Copyright © 2011-2022 走看看