Problema de aspas duplas dentro de aspas duplas para privilégios de nome de banco de dados confidenciais do postgres

Problema de aspas duplas dentro de aspas duplas para privilégios de nome de banco de dados confidenciais do postgres

Ter um banco de dados com nome que diferencia maiúsculas de minúsculas, como MyDb,

se eu quiser usar o psql para conceder todos os privilégios neste banco de dados ao usuário 'usuário', posso simplesmente escrever:

GRANT ALL PRIVILEGES ON DATABASE "MyDb" TO user;

funciona.

Mas e se eu quiser usar scripts de shell?

Executando o seguinte comando:

su - postgres -c "psql -c \"GRANT ALL PRIVILEGES ON DATABASE \"MyDb\" TO user;\""

falha com o erro como:ERROR: database "mydb" does not exist

Responder1

Você poderia usar aspas simples:

postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 MyDb      | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 

$ su - postgres -c 'psql -c "grant all privileges on database \"MyDb\" to user;"'  
GRANT

Mas tome cuidado, pois se você estiver usando variáveis ​​dentro de aspas simples, elas não serão expandidas. No seu caso específico, está tudo bem.

Editar: você também precisa escapar das aspas duplas dentro da solicitação, para que sejam passadas corretamente ao PostGres, a fim de indicar que o nome do banco de dados diferencia maiúsculas de minúsculas.

informação relacionada