Problema de comillas dobles dentro de comillas dobles para privilegios de nombres de bases de datos sensibles a Postgres

Problema de comillas dobles dentro de comillas dobles para privilegios de nombres de bases de datos sensibles a Postgres

Tener una base de datos con nombres que distingan entre mayúsculas y minúsculas como MyDb,

Si quiero usar psql para otorgar todos los privilegios en esta base de datos al usuario 'usuario', simplemente puedo escribir:

GRANT ALL PRIVILEGES ON DATABASE "MyDb" TO user;

funciona.

Pero ¿qué pasa si quiero utilizar scripts de shell?

Ejecutando el siguiente comando:

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

falla con el error como:ERROR: database "mydb" does not exist

Respuesta1

Podrías usar comillas 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

Pero tenga cuidado, ya que si usa variables dentro de comillas simples, no se expandirán. Sin embargo, en tu caso específico, está bien.

Editar: también debe eliminar las comillas dobles dentro de la solicitud, para que se pasen correctamente a PostGres, para indicar que el nombre de la base de datos distingue entre mayúsculas y minúsculas.

información relacionada