Postgresql 资源所有者TopTransaction不拥有relcache引用
我在pipelinedb(基于postgresql 9.5.3)中创建了一个Continuue Transformer来捕获设备状态代码更改的数据。 然后这个连续变换将调用一个函数(触发器), 在函数中,代码根据设备状态代码的变化计算设备状态变化的时间范围,并将其写入表中。 函数中的操作包含select/upate/insert。 在运行期间,我在数据库日志中发现了很多错误消息,但这些错误似乎不会影响代码的正常执行。 然而,当我继续在数据库中接收到这个错误时,我仍然担心会发生什么不好的事情 八月12日03:38:44 tst-gp5-srv3管道[19296]:[141958-1]错误:重新缓存引用ct\u rtd\u his\u狭窄功能不属于资源所有者TopTransaction 8月12日03:38:44 tst-gp5-srv3管道[19296]:[141958-2]声明:ct\u rtd\u his\u狭窄功能 创建或替换函数chr.f_modify_mn_ver_fs() 将触发器返回为 $$ 声明 v_rowcount int; 开始 如果合并(NEW.NEW\u-dev“”)合并(NEW.old\u-dev“”),则 从chr.t\u mn\u ver\u fs中选择count(1)到v\u rowcount,其中mn\u code=NEW.mn\u code和ver\u type='dev',并且是'u current='Y'; 如果v_rowcount>0,则 更新chr.t\u mn\u版本 设置结束时间=NEW.arvl\u时间, is_current='N', 更新时间=时钟时间戳() 其中mn_代码=NEW.mn_代码 和veru type='dev' 并且是_current='Y'; 如果结束Postgresql 资源所有者TopTransaction不拥有relcache引用,postgresql,pipelinedb,Postgresql,Pipelinedb,我在pipelinedb(基于postgresql 9.5.3)中创建了一个Continuue Transformer来捕获设备状态代码更改的数据。 然后这个连续变换将调用一个函数(触发器), 在函数中,代码根据设备状态代码的变化计算设备状态变化的时间范围,并将其写入表中。 函数中的操作包含select/upate/insert。 在运行期间,我在数据库日志中发现了很多错误消息,但这些错误似乎不会影响代码的正常执行。 然而,当我继续在数据库中接收到这个错误时,我仍然担心会发生什么不好的事情 八月
插入到chr.t\u mn\u ver\u fs中(mn\u代码、ver\u类型、ver、begin\u时间、end\u时间、is\u current、INSERT\u时间)
值(NEW.mn_代码'dev',NEW.NEW_sver,NEW.arvl_time,NULL,'Y',clock_timestamp());
如果结束;
如果合并(NEW.NEW_usg“”)合并(NEW.old_usg“”),那么
从chr.t_mn_ver_fs中选择count(1)进入v_rowcount,其中mn_code=NEW.mn_code和ver_type='usg',并且是_current='Y';
如果v_rowcount>0,则
更新chr.t\u mn\u ver\u fs
设置结束时间=NEW.arvl\u时间,
is_current='N',
更新时间=时钟时间戳()
其中mn_代码=NEW.mn_代码
和ver_type='usg'
并且是_current='Y';
如果结束;
插入chr.t\u mn\u ver\u fs(mn\u代码、ver\u类型、ver、begin\u时间、end\u时间、is\u current、INSERT\u时间)
值(NEW.mn_代码'usg',NEW.NEW_-usg,NEW.arvl_-time,NULL,'Y',clock_-timestamp());
如果结束;
如果合并(NEW.NEW_sver“”)合并(NEW.old_sver“”),则
从chr.t\u mn\u ver\u fs中选择count(1)到v\u rowcount,其中mn\u code=NEW.mn\u code和ver\u type='sver',并且是当前的='Y';
如果v_rowcount>0,则
更新chr.t\u mn\u ver\u fs
设置结束时间=NEW.arvl\u时间,
is_current='N',
更新时间=时钟时间戳()
其中mn_代码=NEW.mn_代码
和ver_type='sver'
并且是_current='Y';
如果结束;
插入chr.t\u mn\u ver\u fs(mn\u代码、ver\u类型、ver、begin\u时间、end\u时间、is\u current、INSERT\u时间)
值(NEW.mn_代码'sver',NEW.NEW_sver,NEW.arvl_时间,NULL,'Y',clock_timestamp());
如果结束;
如果合并(NEW.NEW\u hver“”)合并(NEW.old\u hver“”),那么
从chr.t\u mn\u ver\u fs中选择count(1)到v\u rowcount,其中mn\u code=NEW.mn\u code和ver\u type='hver',并且是'u current='Y';
如果v_rowcount>0,则
更新chr.t\u mn\u版本
设置结束时间=NEW.arvl\u时间,
is_current='N',
更新时间=时钟时间戳()
其中mn_代码=NEW.mn_代码
和ver_type='hver'
并且是_current='Y';
如果结束;
插入chr.t\u mn\u ver\u fs(mn\u代码、ver\u类型、ver、begin\u时间、end\u时间、is\u current、INSERT\u时间)
值(NEW.mn_代码'hver',NEW.NEW_hver,NEW.arvl_时间,NULL,'Y',clock_timestamp());
如果结束;
归还新的;
结束;
$$
语言plpgsql;
请参阅GitHub问题,了解对此的回应: CREATE OR REPLACE FUNCTION chr.f_modify_mn_ver_fs() RETURNS trigger AS $$ DECLARE v_rowcount int; BEGIN IF COALESCE(NEW.new_dev,'') <> COALESCE(NEW.old_dev,'') THEN SELECT count(1) INTO v_rowcount FROM chr.t_mn_ver_fs WHERE mn_code=NEW.mn_code AND ver_type='dev' AND is_current='Y'; IF v_rowcount > 0 THEN UPDATE chr.t_mn_ver SET end_time = NEW.arvl_time, is_current = 'N', update_time = clock_timestamp() WHERE mn_code = NEW.mn_code AND ver_type='dev' AND is_current = 'Y'; END IF;
INSERT INTO chr.t_mn_ver_fs (mn_code, ver_type, ver, begin_time, end_time, is_current, insert_time)
VALUES (NEW.mn_code, 'dev', NEW.new_sver, NEW.arvl_time, NULL, 'Y', clock_timestamp());
END IF;
IF COALESCE(NEW.new_usg,'') <> COALESCE(NEW.old_usg,'') THEN
SELECT count(1) INTO v_rowcount FROM chr.t_mn_ver_fs WHERE mn_code=NEW.mn_code AND ver_type='usg' AND is_current='Y';
IF v_rowcount > 0 THEN
UPDATE chr.t_mn_ver_fs
SET end_time = NEW.arvl_time,
is_current = 'N',
update_time = clock_timestamp()
WHERE mn_code = NEW.mn_code
AND ver_type='usg'
AND is_current = 'Y';
END IF;
INSERT INTO chr.t_mn_ver_fs (mn_code, ver_type, ver, begin_time, end_time, is_current, insert_time)
VALUES (NEW.mn_code, 'usg', NEW.new_usg, NEW.arvl_time, NULL, 'Y', clock_timestamp());
END IF;
IF COALESCE(NEW.new_sver,'') <> COALESCE(NEW.old_sver,'') THEN
SELECT count(1) INTO v_rowcount FROM chr.t_mn_ver_fs WHERE mn_code=NEW.mn_code AND ver_type='sver' AND is_current='Y';
IF v_rowcount > 0 THEN
UPDATE chr.t_mn_ver_fs
SET end_time = NEW.arvl_time,
is_current = 'N',
update_time = clock_timestamp()
WHERE mn_code = NEW.mn_code
AND ver_type='sver'
AND is_current = 'Y';
END IF;
INSERT INTO chr.t_mn_ver_fs (mn_code, ver_type, ver, begin_time, end_time, is_current, insert_time)
VALUES (NEW.mn_code, 'sver', NEW.new_sver, NEW.arvl_time, NULL, 'Y', clock_timestamp());
END IF;
IF COALESCE(NEW.new_hver,'') <> COALESCE(NEW.old_hver,'') THEN
SELECT count(1) INTO v_rowcount FROM chr.t_mn_ver_fs WHERE mn_code=NEW.mn_code AND ver_type='hver' AND is_current='Y';
IF v_rowcount > 0 THEN
UPDATE chr.t_mn_ver
SET end_time = NEW.arvl_time,
is_current = 'N',
update_time = clock_timestamp()
WHERE mn_code = NEW.mn_code
AND ver_type='hver'
AND is_current = 'Y';
END IF;
INSERT INTO chr.t_mn_ver_fs (mn_code, ver_type, ver, begin_time, end_time, is_current, insert_time)
VALUES (NEW.mn_code, 'hver', NEW.new_hver, NEW.arvl_time, NULL, 'Y', clock_timestamp());
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;