各位好!
请教个触发器的问题:背景:
我们公司做是gps监控系统的,混凝土行业。最近客户提了个需求,要求我们的gps监控系统与他们已有的erp系统互联,实现实时调度功能。
具体是:erp系统产生的送货单数据要与gps系统共享,erp对送货单的操作要实时体现在gps监控系统上。
公司与做erp系统的公司取得联系,并且获得了数据库接口。实现思路:我们只送货单的增加,修改、删除感兴趣,目标就是获得送货单表中变化了的记录。
知道了数据结构,利用erp公司的sql接口,在送货单表做了三个触发器,分别检测增加,修改,删除操作。
你们在erp系统的数据库总建了一个临时表TempDelivery,用来存放有触发器写入进来的记录。
建了自己的用户hdgps,这个用户只对TempDelivery表有操作权限。
gps系统中增加数据采集模块,其功能就是定时获取TempDelivery中记录,如果成功能获取还会删除成功记录。
触发器代码:
有点长,我觉得与问题关系不大,可以不看。
太长放不下,在后面补充。
问题:
触发建了之后,在查询分析器里单独测试都是正常的。
可是erp系统运行出错了,提示“服务端数据库被修改,操作失败”。
我怀疑是触发器写错了,就把触发器删除,erp系统运行就正常。
为查找原因,建立一个最简单的触发器,代码如下:CREATE TRIGGER TR_DeleteDelivery ON KC_CRKZBEX
FOR DELETE
AS
BEGIN
    select count(*) from TempDelivery //这里几乎没做什么事情
END
go结果erp系统提示同样的错误。
这个触发器几乎不做什么事情,所以我认为和触发器代码无关,只要有触发器在erp就不能正常运行,
是erp系统里做了什么限制,本人是数据库菜鸟,对这样的问题是一头雾水。
咨询了erp公司技术支持人员,称开发人员已经不在公司了,他自己说不出个所以然来。
现在好郁闷!
有劳各位帮忙分析下原因,时分感谢!!!

解决方案 »

  1.   

    用户没权限访问TempDelivery  表?
      

  2.   

    补充代码:/***************************ERP 公司提供接口*********************************/
    select z.vcZBDJBH as 唯一ID号, z.vcDJBH as 送货单号,  CONVERT(char(19)    , z.dtCCSJ, 20) as 出厂时间, dw.vcDWBM as 单位编码, 
           dw.vcDWMC as 单位名称, dw.vcDWJC as 工程名称, z.vcHTBH as 合同编号, z.vcFHDH as 生产任务单号, 
           z.vcZDR as 发货人, z.vcBZ as 备注, ch.vcCHMC as 混凝土等级, jb.vcJBZMC as 搅拌站, z.fSL as 数量, 
           z.dDJ as 单价, z.mJE as 金额, cl.vcCPHM as 车号, zy.vcZYMC as 司机名称,
           z.vcUserDefine01 as 施工部位, z.vcUserDefine04 as 坍落度, xh.vcXHFSMC as 浇灌方法, z.iSSH as 顺序号from kc_crkzbex z left join da_dwda dw on dw.pkgsda=z.pkgsda and dw.pkdwda=z.pkdwda
                      left join da_chda ch on ch.pkgsda=z.pkgsda and ch.pkchda=z.pkchda
                      left join da_xhfsda xh on xh.pkgsda=z.pkgsda and xh.pkxhfsda=z.pkxhfsda
                      left join hnt_jbzda jb on jb.pkgsda=z.pkgsda and jb.pkjbzda=z.pkscsbda
                      left join da_clda cl on cl.pkgsda=z.pkgsda and cl.pkclda=z.pkclda
                      left join da_zyda zy on zy.pkgsda=z.pkgsda and zy.pkzyda=z.pksjda
    where z.cvouchtype='hnt_shd' and z.delflag='n' and z.istate=1
    /*******************************************************************/
    /***************************************送货单临时表*********************************/
    if exists (select 1
                from  sysobjects
               where  id = object_id('TempDelivery')
                and   type = 'U')
       drop table TempDelivery
    go
    /*==============================================================*/
    /* Table: TempDelivery                                          */
    /*==============================================================*/
    create table TempDelivery (
       TriggerTime          varchar(20)          not null default convert(char(19),getdate(),20),
       TriggerFlag          char(1)              not null,
       DeliveryID           varchar(30)          not null,
       TaskID               varchar(30)          null,
       TaskName             nvarchar(20)         null,
       DeliveryDate         varchar(20)          not null,
       ProjectCmpy          varchar(50)          null,
       ProjectName          varchar(50)          null,
       ProjectPart          varchar(50)          null,
       RecipeNo             varchar(50)          null,
       IntensityLevel       varchar(20)          null,
       TLD                  varchar(20)          null,
       SSZDLJ               varchar(30)          null,
       WorkMethod           varchar(30)          null,
       TruckID              varchar(30)          not null,
       Quantity             numeric(18,2)        null,
       PlanCount            numeric(18,2)        null,
       EndCount             numeric(18,2)        null,
       OutCount             int                  null,
       Distance             int                  null,
       FName                nvarchar(20)         null,
       DName                nvarchar(20)         null,
       Memo1                varchar(50)          null,
       Memo2                varchar(50)          null,
       DriverName           nvarchar(20)         null,
       constraint PK_TEMPDELIVERY primary key  (TriggerTime, DeliveryID, DeliveryDate)
    )
    go
    /***************************送货单临时表******************************/
    /*==============================================================*/
    /*                 恒盛公司送货单插入触发器                       */
    /*==============================================================*/if exists (select 1
              from sysobjects
              where id = object_id('TR_InsertDelivery')
              and type = 'TR')
       drop trigger TR_InsertDelivery
    go
    CREATE TRIGGER TR_InsertDelivery ON KC_CRKZBEX
    FOR INSERT
    AS
    BEGIN/*插入送货临时表TempDelivery*/
    INSERT INTO  TempDelivery(TriggerFlag          ,
       DeliveryID          , /*z.vcDJBH*/
       TaskID              , /*z.vcFHDH*/
       TaskName            , /*无任务名*/
       DeliveryDate        , /*z.dtCCSJ*/
       ProjectCmpy         , /*dw.vcDWMC*/
       ProjectName         , /*dw.vcDWJC*/
       ProjectPart         , /*z.vcUserDefine01*/
       RecipeNo            , /*无配比*/
       IntensityLevel      , /*ch.vcCHMC*/
       TLD                 , /*z.vcUserDefine04*/
       SSZDLJ              , /*无粒径*/
       WorkMethod          , /*xh.vcXHFSMC*/
       TruckID             , /*cl.vcCPHM*/
       Quantity            , /*z.fSL*/
       PlanCount           , /*无计划方量*/
       EndCount            , /*无输送方量*/
       OutCount            , /*无车次*/
       Distance            , /*无距离*/
       FName               , /*z.vcZDR*/
       DName               , /*无检验员*/
       Memo1               , /*z.vcBZ*/
       Memo2               , /*无备注2*/
       DriverName /*zy.vcZYMC*/
    )
    SELECT    '0'        ,
       z.vcDJBH            , /*送货单id*/
       z.vcFHDH            , /*任务id*/
       ''                  , /*无任务名*/
       CONVERT(char(19)    , z.dtCCSJ, 20) ,/*送货单时间*/
       dw.vcDWMC           , /*施工单位名称*/
       dw.vcDWJC           , /*工程名*/
       z.vcUserDefine01    , /*施工部位*/
       ''                  , /*无配比*/
       ch.vcCHMC           , /*强度等级*/
       z.vcUserDefine04    , /*塌落度*/
       ''                  , /*无粒径*/
       xh.vcXHFSMC         , /*工作方式*/
       ISNULL(cl.vcCPHM, ''), /*车辆编号*/
       z.fSL               , /*本车方量*/
       0.0                 , /*无计划方量*/
       0.0                 , /*无输送方量*/
       0                   , /*无车次*/
       0.0                 , /*无距离*/
       z.vcZDR             , /*发货人*/
       ''                  , /*无检验员*/
       z.vcBZ              , /*备注1*/
       ''                 , /*无备注2*/
                               zy.vcZYMC  /*司机*/
    FROM inserted  z left join da_dwda dw on dw.pkgsda=z.pkgsda and dw.pkdwda=z.pkdwda
                      left join da_chda ch on ch.pkgsda=z.pkgsda and ch.pkchda=z.pkchda
                      left join da_xhfsda xh on xh.pkgsda=z.pkgsda and xh.pkxhfsda=z.pkxhfsda
                      left join hnt_jbzda jb on jb.pkgsda=z.pkgsda and jb.pkjbzda=z.pkscsbda
                      left join da_clda cl on cl.pkgsda=z.pkgsda and cl.pkclda=z.pkclda
                      left join da_zyda zy on zy.pkgsda=z.pkgsda and zy.pkzyda=z.pksjda
    where z.cvouchtype='hnt_shd' and z.delflag='n' and z.istate=1END     
    go
      

  3.   


    /*==============================================================*/
    /*                 *恒盛公司送货单修改触发器                      */
    /*==============================================================*/
    if exists (select 1
              from sysobjects
              where id = object_id('TR_UpdateDelivery')
              and type = 'TR')
       drop trigger TR_UpdateDelivery
    go
    CREATE TRIGGER TR_UpdateDelivery ON KC_CRKZBEX
    FOR UPDATE
    AS/**************修改了删除标志为非“N”或状态标志为非“1”相当于删除*********/
    IF UPDATE(delflag) or UPDATE(istate)
    BEGIN/*插入送货临时表TempDelivery*/
    INSERT INTO  TempDelivery(TriggerFlag          ,
       DeliveryID          , /*z.vcDJBH*/
       TaskID              , /*z.vcFHDH*/
       TaskName            , /*无任务名*/
       DeliveryDate        , /*z.dtCCSJ*/
       ProjectCmpy         , /*dw.vcDWMC*/
       ProjectName         , /*dw.vcDWJC*/
       ProjectPart         , /*z.vcUserDefine01*/
       RecipeNo            , /*无配比*/
       IntensityLevel      , /*ch.vcCHMC*/
       TLD                 , /*z.vcUserDefine04*/
       SSZDLJ              , /*无粒径*/
       WorkMethod          , /*xh.vcXHFSMC*/
       TruckID             , /*cl.vcCPHM*/
       Quantity            , /*z.fSL*/
       PlanCount           , /*无计划方量*/
       EndCount            , /*无输送方量*/
       OutCount            , /*无车次*/
       Distance            , /*无距离*/
       FName               , /*z.vcZDR*/
       DName               , /*无检验员*/
       Memo1               , /*z.vcBZ*/
       Memo2               , /*备注2*/
       DriverName /*zy.vcZYMC*/
    )
    SELECT    '1'        ,
       z.vcDJBH            , /*送货单id*/
       z.vcFHDH            , /*任务id*/
       ''                  , /*无任务名*/
       CONVERT(char(19)    , z.dtCCSJ, 20) ,/*送货单时间*/
       dw.vcDWMC           , /*施工单位名称*/
       dw.vcDWJC           , /*工程名*/
       z.vcUserDefine01    , /*施工部位*/
       ''                  , /*无配比*/
       ch.vcCHMC           , /*强度等级*/
       z.vcUserDefine04    , /*塌落度*/
       ''                  , /*无粒径*/
       xh.vcXHFSMC         , /*工作方式*/
       ISNULL(cl.vcCPHM, ''), /*车辆编号*/
       z.fSL               , /*本车方量*/
       0.0                 , /*无计划方量*/
       0.0                 , /*无输送方量*/
       0                   , /*无车次*/
       0.0                 , /*无距离*/
       z.vcZDR             , /*发货人*/
       ''                  , /*无检验员*/
       z.vcBZ              , /*备注1*/
       ''                 , /*无备注2*/
                               zy.vcZYMC  /*司机*/
    FROM inserted  z left join da_dwda dw on dw.pkgsda=z.pkgsda and dw.pkdwda=z.pkdwda
                      left join da_chda ch on ch.pkgsda=z.pkgsda and ch.pkchda=z.pkchda
                      left join da_xhfsda xh on xh.pkgsda=z.pkgsda and xh.pkxhfsda=z.pkxhfsda
                      left join hnt_jbzda jb on jb.pkgsda=z.pkgsda and jb.pkjbzda=z.pkscsbda
                      left join da_clda cl on cl.pkgsda=z.pkgsda and cl.pkclda=z.pkclda
                      left join da_zyda zy on zy.pkgsda=z.pkgsda and zy.pkzyda=z.pksjda
    where z.cvouchtype='hnt_shd' and (z.delflag<>'n' or z.istate <>1)ENDELSE /*修改了除delflag 和 istate 以外的字段*/
    BEGIN/*插入送货临时表TempDelivery*/
    INSERT INTO  TempDelivery(TriggerFlag          ,
       DeliveryID          , /*z.vcDJBH*/
       TaskID              , /*z.vcFHDH*/
       TaskName            , /*无任务名*/
       DeliveryDate        , /*z.dtCCSJ*/
       ProjectCmpy         , /*dw.vcDWMC*/
       ProjectName         , /*dw.vcDWJC*/
       ProjectPart         , /*z.vcUserDefine01*/
       RecipeNo            , /*无配比*/
       IntensityLevel      , /*ch.vcCHMC*/
       TLD                 , /*z.vcUserDefine04*/
       SSZDLJ              , /*无粒径*/
       WorkMethod          , /*xh.vcXHFSMC*/
       TruckID             , /*cl.vcCPHM*/
       Quantity            , /*z.fSL*/
       PlanCount           , /*无计划方量*/
       EndCount            , /*无输送方量*/
       OutCount            , /*无车次*/
       Distance            , /*无距离*/
       FName               , /*z.vcZDR*/
       DName               , /*无检验员*/
       Memo1               , /*z.vcBZ*/
       Memo2               , /*备注2*/
       DriverName /*zy.vcZYMC*/
    )
    SELECT    '2'        ,
       z.vcDJBH            , /*送货单id*/
       z.vcFHDH            , /*任务id*/
       ''                  , /*无任务名*/
       CONVERT(char(19)    , z.dtCCSJ, 20) ,/*送货单时间*/
       dw.vcDWMC           , /*施工单位名称*/
       dw.vcDWJC           , /*工程名*/
       z.vcUserDefine01    , /*施工部位*/
       ''                  , /*无配比*/
       ch.vcCHMC           , /*强度等级*/
       z.vcUserDefine04    , /*塌落度*/
       ''                  , /*无粒径*/
       xh.vcXHFSMC         , /*工作方式*/
       ISNULL(cl.vcCPHM, ''), /*车辆编号*/
       z.fSL               , /*本车方量*/
       0.0                 , /*无计划方量*/
       0.0                 , /*无输送方量*/
       0                   , /*无车次*/
       0.0                 , /*无距离*/
       z.vcZDR             , /*无发货人*/
       ''                  , /*检验员*/
       z.vcBZ              , /*备注1*/
       ''                 , /*备注2*/
                               zy.vcZYMC  /*司机*/
    FROM inserted  z left join da_dwda dw on dw.pkgsda=z.pkgsda and dw.pkdwda=z.pkdwda
                      left join da_chda ch on ch.pkgsda=z.pkgsda and ch.pkchda=z.pkchda
                      left join da_xhfsda xh on xh.pkgsda=z.pkgsda and xh.pkxhfsda=z.pkxhfsda
                      left join hnt_jbzda jb on jb.pkgsda=z.pkgsda and jb.pkjbzda=z.pkscsbda
                      left join da_clda cl on cl.pkgsda=z.pkgsda and cl.pkclda=z.pkclda
                      left join da_zyda zy on zy.pkgsda=z.pkgsda and zy.pkzyda=z.pksjda
    where z.cvouchtype='hnt_shd' and z.delflag='n' and z.istate=1
    END
    go
      

  4.   


    /*==============================================================*/
    /*                 恒盛公司送货单删除触发器                       */
    /*==============================================================*/
    if exists (select 1
              from sysobjects
              where id = object_id('TR_DeleteDelivery')
              and type = 'TR')
       drop trigger TR_DeleteDelivery
    goCREATE TRIGGER TR_DeleteDelivery ON KC_CRKZBEX
    FOR DELETE
    AS
    BEGIN/*插入送货临时表TempDelivery*/
    INSERT INTO  TempDelivery(TriggerFlag          ,
       DeliveryID          , /*z.vcDJBH*/
       TaskID              , /*z.vcFHDH*/
       TaskName            , /*无任务名*/
       DeliveryDate        , /*z.dtCCSJ*/
       ProjectCmpy         , /*dw.vcDWMC*/
       ProjectName         , /*dw.vcDWJC*/
       ProjectPart         , /*z.vcUserDefine01*/
       RecipeNo            , /*无配比*/
       IntensityLevel      , /*ch.vcCHMC*/
       TLD                 , /*z.vcUserDefine04*/
       SSZDLJ              , /*无粒径*/
       WorkMethod          , /*xh.vcXHFSMC*/
       TruckID             , /*cl.vcCPHM*/
       Quantity            , /*z.fSL*/
       PlanCount           , /*无计划方量*/
       EndCount            , /*无输送方量*/
       OutCount            , /*无车次*/
       Distance            , /*无距离*/
       FName               , /*z.vcZDR*/
       DName               , /*无检验员*/
       Memo1               , /*z.vcBZ*/
       Memo2               , /*备注2*/
       DriverName /*zy.vcZYMC*/
    )
    SELECT    '1'        ,
       z.vcDJBH            , /*送货单id*/
       z.vcFHDH            , /*任务id*/
       ''                  , /*无任务名*/
       CONVERT(char(19)    , z.dtCCSJ, 20) ,/*送货单时间*/
       dw.vcDWMC           , /*施工单位名称*/
       dw.vcDWJC           , /*工程名*/
       z.vcUserDefine01    , /*施工部位*/
       ''                  , /*无配比*/
       ch.vcCHMC           , /*强度等级*/
       z.vcUserDefine04    , /*塌落度*/
       ''                  , /*无粒径*/
       xh.vcXHFSMC         , /*工作方式*/
       ISNULL(cl.vcCPHM,''), /*车辆编号*/
       z.fSL               , /*本车方量*/
       0.0                 , /*无计划方量*/
       0.0                 , /*无输送方量*/
       0                   , /*无车次*/
       0.0                 , /*无距离*/
       z.vcZDR             , /*发货人*/
       ''                  , /*无检验员*/
       z.vcBZ              , /*备注1*/
       ''                 , /*无备注2*/
                               zy.vcZYMC  /*司机*/
    FROM deleted  z left join da_dwda dw on dw.pkgsda=z.pkgsda and dw.pkdwda=z.pkdwda
                      left join da_chda ch on ch.pkgsda=z.pkgsda and ch.pkchda=z.pkchda
                      left join da_xhfsda xh on xh.pkgsda=z.pkgsda and xh.pkxhfsda=z.pkxhfsda
                      left join hnt_jbzda jb on jb.pkgsda=z.pkgsda and jb.pkjbzda=z.pkscsbda
                      left join da_clda cl on cl.pkgsda=z.pkgsda and cl.pkclda=z.pkclda
                      left join da_zyda zy on zy.pkgsda=z.pkgsda and zy.pkzyda=z.pksjda
    where z.cvouchtype='hnt_shd' and z.delflag='n' and z.istate=1  
    END
    go
      

  5.   

    估计erp是delphi写的,测试下下面的,可以的话批量修改CREATE TRIGGER TR_DeleteDelivery ON KC_CRKZBEX
    FOR DELETE
    AS
    BEGIN
      set nocount on; --加这句试试
      select count(*) from TempDelivery //这里几乎没做什么事情
    END
    go
      

  6.   

    erp公司人员说用的是sa用户啊
    sa是odb,应该有权限吧
      

  7.   

    erp好像是vb做的,我会去确认下的,谢谢!
      

  8.   

    在你CREATE TRIGGER TR_DeleteDelivery ON KC_CRKZBEX
    FOR DELETE
    AS
    BEGIN
      select count(*) from TempDelivery //这里几乎没做什么事情
    END
    go这个触发器触发之前,操作是怎样的!
      

  9.   


    意思是说erp系统做了些什么吗?
    我不知道啊,他们的技术支持人员只负责部署了系统,开发人员不在这里了。我们的系统还没做任何事情,现在只部署了触发器。。
      

  10.   


    你建立好触发器后,在ERP做了什么操作弹出的这个框!
      

  11.   

    可是erp系统运行出错了,提示“服务端数据库被修改,操作失败”。
    只要运行ERP就报这个错误?
    ERP是用sa用户运行的?
      

  12.   

    你用事件探查器看下审核过程中对数据库做了哪些操作,有没触发这个触发器的可能,没有触发不会报这种错误吧!要么加完触发器把ERP重新运行下看看。
      

  13.   

    如果添加一个简单的存储过程呢?ERP能否运行。
      

  14.   

    应该是erp里面有监控数据库对象变化的语句
      

  15.   

    找erp公司沟通了,对方称开发人员已经不再那里了,不清楚有什么限制。