Вот что уже работает, но использует цикл:
(я обновляю поле nickname, slug
в удаленной таблице для каждой строки в локальной таблице)
DECLARE
row_ record;
rdbname_ varchar;
....
/* select from local */
FOR row_ IN SELECT rdbname, objectvalue1 as keyhash, cvalue1 as slug, cvalue2 as nickname
FROM bme_tag
where rdbname = rdbname_
and tagtype = 'NAME'
and wkseq = 0
LOOP
/* update remote */
PERFORM dblink_exec('sysdb',
format(
'update bme_usergroup
set nickname = %L
,slug = %L
where rdbname = %L
and wkseq = 0
and keyhash = %L'
, row_.nickname, row_.slug, row_.rdbname, row_.keyhash)
);
END LOOP;
Теперь я хотел бы вместо этого выполнить массовую UPDATE (remote) FROM (local)
PERFORM dblink_exec('sysdb',
'update (remote)bme_usergroup
set nickname = bme_tag.cvalue2, slug=bme_tag.cvalue1
from (local).bme_tag s
where bme_usergroup.rdbname = %L
and bme_usergroup.wkseq = 0
and bme_usergroup.keyhash = s.keyhash
and bme_usergroup.rdbname = s.rdbname
)
Я достиг этого далеко, посмотрев различные решения ( postgresql: INSERT INTO ... (SELECT* ...) ) и я знаю, как разделить удаленные и локальные таблицы запроса в контексте SELECT
, DELETE
и даже INSERT/SELECT
.И я могу сделать это прямое обновление с переменными связывания тоже.Но как насчет UPDATE FROM
?
Если это невозможно, я должен посмотреть на FOREIGN TABLE
Postgres или что-то подобное?
Локальные и удаленные БД включенытот же сервер Postgres.Еще одна дополнительная информация, если это имеет значение, заключается в том, что любая база данных может быть удалена и восстановлена отдельно от другой, и я бы предпочел легкое решение, которое не требует много настроек каждый раз для восстановления связи.