Conforme descrito aqui , o postgres atualmente não permite que você use
CREATE FUNCTION
simultaneamente:Uma solução para isso é garantir que não haja duas transações tentando fazer a
CREATE FUNCTION
ao mesmo tempo. Você pode usar posgres bloqueios de aviso por isso.
Uma boa introdução aos bloqueios consultivos pode ser encontrada aqui:https://vladmihalcea .com/how-do-postgresql-advisory-locks-work/
Por exemplo, você pode usar:
BEGIN; -- start of transaction
SELECT pg_advisory_xact_lock(2142616474639426746); -- random 64-bit signed ('bigint') lock number
CREATE OR REPLACE FUNCTION myfunction ...
COMMIT;
Isso requer um bloqueio consultivo exclusivo no nível da transação, para que duas transações simultâneas não possam ser executadas para criar a função ao mesmo tempo. Ao final da transação, o bloqueio é liberado automaticamente.