5

在安装我的应用程序期间,我想创建一个 PostgreSQL 数据库以及一些表和函数。

为此,我使用 PostgreSQL 附带的 PSQL.EXE。我有 2 个脚本。第一个创建数据库和有权在该数据库上执行脚本的相应用户。我想以刚刚创建的用户身份执行第二个脚本。不幸的是,我找不到将该用户的密码作为命令行参数传递的方法。省略密码会导致执行停止并提示用户输入密码,我想避免这种情况 - 因为这是在我的应用程序安装期间执行的。

有什么方法可以将密码作为参数传递,或者我可以使用任何其他命令行工具吗?

进一步解释环境。我使用 WiX 3.5 设置作为“MSI-Builder”。

4

4 回答 4

6

You can either use a pgpass file as dbenhur answerd, or you can set the environment variable PGPASSWORD before calling psql:

SET PGPASSWORD=my_very_secret_password
psql somedb someuser

All supported environment variables are documented in the manual: http://www.postgresql.org/docs/current/static/libpq-envars.html

于 2012-06-14T19:47:13.127 回答
5

您不能通过 cmdline arg 提供密码(并且不希望这样做,因为这是糟糕的安全做法)。

您可以提供 .pgpass 文件来支持自动脚本身份验证。这是文档

于 2012-06-14T18:58:18.563 回答
2

更好的是,如果您有权创建 db 角色,那么您已经拥有所需的所有访问权限,而无需仔细使用密码登录。让第二个脚本在与第一个脚本相同的用户下运行,但包含以下行以切换用户:

set role my_new_user;

my_new_user您要运行它的角色的名称在 哪里。

如果您因为登录名不同而仅划分脚本,那么它们可以进入同一个文件并在中途切换角色。


注意: 如果您没有以超级用户身份创建数据库和新角色,这可能会稍微复杂一些。如果是这种情况,您将需要使用以下命令创建新角色:

create role my_new_role ... ADMIN my_role;

my_new_role您正在创建的角色在哪里,并且my_role是您的当前用户。然后当你简单地完成时:

revoke my_new_role from my_role;
于 2012-06-14T19:43:20.823 回答
2

为了完成,您还可以使用 URI(文档链接

列出数据库

psql "postgresql://username:password@localhost/postgres" -l

我还精心设计了这个命令,让它只有名字(如果你知道更好的方法,请告诉我):

psql "postgresql://username:password@localhost/postgres" -l | awk -F '|' '{print $1}'| sed -e '/^\s*$/ d' -e '1,3d'|sed '$d'|awk '{print $1}'

您还可以使用 unix socket 进行连接:

# ss -x -a |grep postgres|awk '{print $5}'
/var/run/postgresql/.s.PGSQL.5432

注意使用socket的父目录:

# sudo -u postgres psql -d "postgresql:///postgres?host=/var/run/postgresql/" -l

只有在您的 中有此行​​时,您才能执行此操作pg_hba.conf

local   all     postgres                ident

"ident" 使用 unix 用户进行身份验证

转储一个数据库

这里我添加了一个不同的端口号

pg_dump -Fc "postgresql://username:password@localhost:9001/${db}" > "backup_${db}.pgdump"

使用 dumpall,您需要一个超级用户或角色(使用CREATE ROLE ... SUPERUSER)。它必须有权访问所有数据库。默认postgres可以。

但就我而言,我无法将 pg_dumpall 与 postgres 一起使用,因为他的密码已被开发人员删除。

所以我用:

 sudo -u postgres pg_dumpall -d "postgresql:///?host=/var/run/postgresql/" > all.dump

测试版

# cat /opt/postgresql/PG_VERSION
9.6

hth

于 2018-10-26T09:30:02.950 回答