Как ссылаться на значения аргументов процедур PostgreSQL внутри операторов SQL, таких как REASSIGN OWNED? - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь воссоздать несколько баз данных и пользователей, выполняющих файл SQL через psql.exe.И я не хочу переходить на createuser и подобные инструменты.

Вот мой входной файл для psql.Я намеренно изменил LANGUAGE на несуществующий PSQL, чтобы подчеркнуть, что я пытаюсь запустить его, используя psql (из командного файла).Это немного псевдокод, но вы поняли.Языки SQL или pgplsql ничего не решают, ошибка та же: postgres использует username в качестве значения REASSIGN OWNED вместо user456.

CREATE OR REPLACE PROCEDURE create_database_and_user(
  dbName character varying,
  username character varying,
  password character varying)
AS $$
  REASSIGN OWNED BY username TO postgres;
  DROP OWNED BY username;

  -- ...other statements...

  \connect "dbname=${dbName} user=${username} password=${password}"
$$ LANGUAGE PSQL;


CALL create_database_and_user('db123', 'user456', 'p@ss');

Не работает

psql:./initdb.sql:14: ERROR:  language "psql" does not exist
psql:./initdb.sql:17: ERROR:  role "username" does not exist
CONTEXT:  SQL function "create_database_and_user" statement 1

1 Ответ

0 голосов
/ 25 ноября 2018

Это потому, что REASSIGN OWNED не работает с подготовленными выражениями, что означает, что вы не можете использовать его с параметрами в функции.

Вам придется использовать динамический SQL длячто:

EXECUTE format('REASSIGN OWNED BY %I TO postgres',
               username);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...