EBR进阶教程 · 2022年9月9日 0

解决ebr设备更新报错,EQP_STATEVALUE more than one row

问题排查报告

问题跟踪

##

首先定位到EQP_STATEVALUE表,发现数据出现重复:

执行语句取出所有非重复数据:

select t.stateid,t.fk_statelistcst,t.code,t.label,t.functionid,t.pk_id,
       t.dlu,
       t.dluunit,
       t.cpt,
       t.haseqpimpact from EQP_STATEVALUE t group by t.stateid,
       t.fk_statelistcst,
       t.code,
       t.label,
       t.functionid,
       t.pk_id,
       t.dlu,
       t.dluunit,
       t.cpt,
       t.haseqpimpact

然后删除并还原,本以为应该就好了,发现一会数据又上来了,说明脏数据不只是这个,停掉服务继续排查

在设备管理点修改设备,发现弹出下面的报错:

根据提示,找到该Function:

发现该函数第30行有个PK_ID=….. 这里报错,说明后面的语句查询到的值不止一个!

对数据追踪:

SELECT EQP_PTYVAL.FK_PROPERTYTYPE, EQP_PTYVAL.ENTITYID, EQP_PTYVAL.ENTITYCSTID 
FROM EQP_PTYVAL
 WHERE FK_CLASSID = 1016 AND FK_PROPERTYID = 730

继续追:

发现这个重复了,备份并删除!

本以为好了,点击更新出现如下报错:

然后根据提示,排查Eqp_Eqpexe_Statustransmgt这个表,发现并没有什么重复数据,崩溃!!!!

只能一个个表去排查,最终发现EQP_TRANVALUE下面数据有异常!

按照上面的去重方法,把这里数据去除重复,在去更新:

完美!!!

总结

  • EQP_PTYVAL表有一个脏数据,导致服务在自动更新设备状态的时候重复的向``EQP_STATEVALUEEQP_TRANVALUE插入了数据

如何避免

在PI运行的时候切勿去操作设备类或修改属性,如果这个设备正在被PI占用,就会出现这个情况。