Postgres 9.6.9 no Linux RHEL 6.10
Se eu colocar meu comando DO entre aspas duplas e as funções entre aspas simples, o bash interpretará o $$
, e isso obviamente fará com que o comando falhe. Então, troquei as aspas duplas e simples, mas agora ele trata os NOT IN
literais de string como nomes de coluna, o que também gera um erro.
Então, como mencionado no título, qual é o molho mágico para fazer um DO $$
comando funcionar a partir da linha de comando?
$ export PGHOST=10.x.y.z
$ export PGUSER=postgres
$ psql -c 'do $$
> declare rolename text;
> begin
> for rolename in select rolname
> from pg_roles
> where rolname not in ("postgres",
> "pg_signal_backend",
> "TAP")
> loop
> execute "DROP ROLE " || rolename;
> end loop;
> end $$
> ;'
ERROR: column "postgres" does not exist
LINE 3: where rolname not in ("postgres",...
^
QUERY: select rolname
from pg_roles
where rolname not in ("postgres", "pg_signal_backend", "TAP")
CONTEXT: PL/pgSQL function inline_code_block line 4 at FOR over SELECT rows
Obrigado
Usando
\
para escapar do dólar$
Referência ao psql doc , para executar vários comandos, eles também fornecem 3 maneiras de contornar conforme abaixo
-c
1) Opção de repetições2) Combina
echo
epsql
3) Usos
psql
eEOF
Além disso, considerando mudar
rolename text
pararolename RECORD
evitarERROR: missing FROM-clause entry for table
( tipo de registro )Em relação ao seu caso, tome cuidado com
DROP ROLE
as dependências (consulte: droping role )Por último, mas não menos importante, aqui está o meu exemplo