Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / dblink connection error / 5 сообщений из 5, страница 1 из 1
27.05.2015, 11:55
    #38969601
djpeter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dblink connection error
Есть вот такая процедура, копирующая данные из новой базы в старую.

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')"

Почему так?
...
Рейтинг: 0 / 0
27.05.2015, 13:19
    #38969728
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dblink connection error
djpeter,

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

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


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


как-то так.
...
Рейтинг: 0 / 0
27.05.2015, 14:37
    #38969821
djpeter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dblink connection error
Я переписал вот так

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;

Результат тот же. Если выполнять команды по отдельности из консоли, т.е. подключиться, выполнить запрос, то все работает
...
Рейтинг: 0 / 0
27.05.2015, 14:53
    #38969839
djpeter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dblink connection error
Заработало, убрал селект, там же перформ нужен на запуск соединения
...
Рейтинг: 0 / 0
27.05.2015, 15:01
    #38969847
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dblink connection error
djpeterЗаработалоОсталось только помолиться, что системой будут пользоваться только в один поток.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / dblink connection error / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]