Двойные кавычки внутри Двойные кавычки Проблема для привилегий имени чувствительной базы данных postgres

Двойные кавычки внутри Двойные кавычки Проблема для привилегий имени чувствительной базы данных postgres

Имея базу данных с именем, чувствительным к регистру, например MyDb,

Если я хочу использовать psql для предоставления всех привилегий в этой базе данных пользователю «user», я могу просто написать:

GRANT ALL PRIVILEGES ON DATABASE "MyDb" TO user;

оно работает.

Но что, если я хочу использовать скрипты оболочки?

Выполнив следующую команду:

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

завершается ошибкой вида:ERROR: database "mydb" does not exist

решение1

Вы можете использовать одинарные кавычки:

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

Но будьте осторожны, так как если вы используете переменные внутри одинарных кавычек, они не будут расширены. В вашем конкретном случае это нормально.

Редактировать: вам также необходимо экранировать двойные кавычки внутри запроса, чтобы они правильно передавались в PostGres, чтобы указать, что имя базы данных чувствительно к регистру.

Связанный контент