在安装我的应用程序期间,我想创建一个PostgreSQL数据库以及一些表和函数。
为此,我使用PostgreSQL附带的PSQL.EXE。我有2个脚本。第一个创建数据库和相应的用户,该用户有权在该数据库上执行脚本。我想执行第二个脚本,因为这只是刚创建的用户。不幸的是,我找不到将该用户的密码作为命令行参数传递的方法。省略密码会导致执行停止并提示用户输入密码,我希望避免 - 因为这是在我的应用安装期间执行的。
有没有办法将密码作为参数传递,还是有其他命令行工具我可以使用?
进一步解释环境。我使用WiX 3.5设置作为“MSI-Builder”。
答案 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