PostrgreSQL пытается выполнить функцию plsh - PullRequest
0 голосов
/ 20 марта 2019

ПРИМЕЧАНИЕ: plsh - это язык PostgreSQL, который выполняет команды оболочки.

Я пытаюсь вызвать функцию plsh из функции plpgsql.

Сначала есть большая функция plpgsql:

CREATE OR REPLACE FUNCTION my_schema.big_function(my_arg character varying)
RETURNS text AS
$BODY$
BEGIN
    DROP TABLE IF EXISTS backend.table_B;
    CREATE TABLE backend.table_B AS
    --Create a table with a SELECT with some joins,
    --right now the resulting table is empty

    RAISE NOTICE 'table_B created';

    PERFORM my_schema.insert_from_shell(my_arg);

    RETURN 'Function Ended';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

Затем есть функция plsh:

CREATE OR REPLACE FUNCTION my_schema.insert_from_shell(my_arg character varying)
RETURNS text AS
$BODY$
#!/bin/sh
PGPASSWORD=mypassword psql -d mydatabase -h myhost -p myport -U myuser -c "INSERT INTO myschema.table_A(mycolumn) VALUES('$1')"
$BODY$
LANGUAGE plsh VOLATILE
COST 100;

Когда я пытаюсь выполнить следующее:

SELECT my_schema.big_function('test');

это никогда не заканчивается.С другой стороны, если я прокомментирую строку PERFORM из первой функции и вызову обе функции по отдельности, каждая из них завершится менее чем за секунду:

SELECT my_schema.big_function('test');
SELECT my_schema.insert_from_shell('test');

Может быть проблема с выполнением plsh функций из plpgsql функций, но я не уверен.

Я мог бы обойти это, вызывая обе функции по отдельности, используя скрипт вне базы данных, но я бы лучше решил его из базы данныхи вызовите одну функцию.

Любой указатель или помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 20 марта 2019

Предполагая, что триггер в транзакции big_function устанавливает конфликтующую блокировку на table_a, как предлагается в комментарии, вы можете рассмотреть следующее решение:

Сделайте триггер CONSTRAINT TRIGGER (тогда он должен быть триггером AFTER) и объявите его как DEFERRABLE INITIALLY DEFERRED. Тогда он не будет работать правильно, когда срабатывает оператор триггера, но будет перенесен на COMMIT в конце транзакции.

К этому времени, insert_from_shell закончен и зафиксирован, так что тупика не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...