Postgres 敏感数据库名称权限的双引号内双引号问题

Postgres 敏感数据库名称权限的双引号内双引号问题

拥有区分大小写名称的数据库(如 MyDb),

如果我想使用 psql 将此数据库的所有权限授予用户“user”,我只需这样写:

GRANT ALL PRIVILEGES ON DATABASE "MyDb" TO user;

有用。

但是如果我想使用 shell 脚本该怎么办?

运行以下命令:

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,以表明数据库名称区分大小写。

相关内容