二重引用符内の二重引用符は、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

ただし、一重引用符内で変数を使用する場合は、変数は展開されないので注意してください。ただし、あなたの特定のケースでは問題ありません。

編集: DB 名が大文字と小文字を区別することを示すために、リクエスト内の二重引用符をエスケープして、PostGres に正しく渡す必要もあります。

関連情報