如何在没有userinput / password的情况下从命令行执行PostgreSQL脚本文件

时间:2012-06-14 18:49:33

标签: postgresql command-line wix command-line-arguments

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

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

有没有办法将密码作为参数传递,还是有其他命令行工具我可以使用?

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

4 个答案:

答案 0 :(得分:6)

你可以使用pgpass文件作为dbenhur answerd,也可以在调用psql之前设置环境变量PGPASSWORD:

SET PGPASSWORD=my_very_secret_password
psql somedb someuser

手册中记录了所有受支持的环境变量:http://www.postgresql.org/docs/current/static/libpq-envars.html

答案 1 :(得分:5)

您无法通过cmdline arg提供密码(并且不希望因为安全性较差)。

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

答案 2 :(得分:2)

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

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;

答案 3 :(得分:0)

为完成操作,您还可以使用URI(doc link

列出数据库

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套接字进行连接:

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

请注意,使用了套接字的父目录:

# 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