dblink connection error

djpeter
Дата: 27.05.2015 11:55:09
Есть вот такая процедура, копирующая данные из новой базы в старую.

CREATE OR REPLACE FUNCTION onregioninsert()
RETURNS trigger AS
$BODY$
DECLARE
oldid integer = 0;
connid boolean;
BEGIN
connid := (SELECT (public.dblink_get_connections())[1]) ISNULL;
IF (connid) ISNULL THEN
PERFORM public.dblink_connect('new2old','dbname=olddb port=5432 host=127.0.0.1 user=username password=password');
END IF;
PERFORM public.dblink_exec('new2old','ALTER TABLE area DISABLE TRIGGER areainsert');
SELECT oldid FROM public.dblink('new2old','INSERT INTO "area" ("name") VALUES($$' || NEW.name ||'$$) RETURNING rowid') AS t1(rowid integer) INTO oldid;
UPDATE "Region" SET "oldRowid" = oldid WHERE "idRegion" = NEW."idRegion";
PERFORM public.dblink_exec('new2old','ALTER TABLE area ENABLE TRIGGER areainsert');
PERFORM dblink_disconnect('new2old');
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

при попытке добавления записи в таблице Region в новой базе вылезает:
Ошибка: ERROR: could not establish connection
DETAIL: missing "=" after "new2old" in connection info string

CONTEXT: SQL statement "SELECT public.dblink_exec('new2old','ALTER TABLE area DISABLE TRIGGER areainsert')"

Почему так?
qwwq
Дата: 27.05.2015 13:19:08
djpeter,

потому что у вас неверно проверяется отсутствие соединения дблинка с именем 'new2old' в списке соединений сеанса.

// у вас проверяется отсутствие каких--либо соединений, что неверно)
как правильно -- см доку. (что то про 'new2old' = ANY(dblink_get_connections() )


в итоге -- какое то соединение у вас открыто, но с другим именем, или безымянное.
поэтому вы не попадаете на ветку с открытием именнованного соединения (массив соединений не пуст)
в итоге, dblink пытается трактовать 'new2old' как строку соединения, которая формально парсится как param=value. и именно вот этого = парсер и не находит.


как-то так.
djpeter
Дата: 27.05.2015 14:37:02
Я переписал вот так

connid boolean = false;
BEGIN
connid := (SELECT 'new2old' = ANY (public.dblink_get_connections()));
IF NOT connid THEN
SELECT public.dblink_connect('new2old','dbname=щвви port=5432 host=127.0.0.1 user=user password=password');
END IF;

Результат тот же. Если выполнять команды по отдельности из консоли, т.е. подключиться, выполнить запрос, то все работает
djpeter
Дата: 27.05.2015 14:53:28
Заработало, убрал селект, там же перформ нужен на запуск соединения
p2.
Дата: 27.05.2015 15:01:09
djpeter
Заработало
Осталось только помолиться, что системой будут пользоваться только в один поток.