如何在没有用户输入/密码的情况下从命令行执行PostgreSQL脚本文件

如何在没有用户输入/密码的情况下从命令行执行PostgreSQL脚本文件,postgresql,command-line,wix,command-line-arguments,Postgresql,Command Line,Wix,Command Line Arguments,在安装我的应用程序的过程中,我想创建一个PostgreSQL数据库以及一些表和函数 为此,我使用PostgreSQL附带的PSQL.EXE。我有两个脚本。第一个创建数据库和相应的用户,该用户有权在该数据库上执行脚本。我想执行第二个脚本,因为这是刚刚创建的用户。不幸的是,我找不到一种方法将该用户的密码作为命令行参数传递。省略密码会导致执行停止,并提示用户输入密码,这是我希望避免的,因为这是在安装我的应用程序时执行的 是否有任何方法可以将密码作为参数传递,或者是否有任何其他命令行工具可以使用 进一步

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

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

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


进一步解释一下环境。我使用WiX 3.5安装程序作为“MSI生成器”。

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


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

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

set role my_new_user;
其中
my\u new\u user
是您要作为其运行的角色的名称

如果您只是因为不同的登录名而划分了脚本,那么它们可以放在同一个文件中,只需中途切换角色


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

create role my_new_role ... ADMIN my_role;
其中,
my_new_role
是您正在创建的角色,
my_role
是您的当前用户。然后,当您完成时,只需:

revoke my_new_role from my_role;

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

SET PGPASSWORD=my_very_secret_password
psql somedb someuser

所有支持的环境变量都记录在手册中:

为了完成,您还可以使用URI()

列表数据库 我还精心编制了此命令,使其仅包含名称(如果您知道更好的方法,请告诉我):

您还可以使用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,您需要一个超级用户或角色(使用
创建角色…超级用户
)。它必须能够访问所有数据库。默认情况下,
postgres
can

但在我的例子中,我不能将pg_dumpall与postgres一起使用,因为他的密码被devs删除了

所以我用了:

 sudo -u postgres pg_dumpall -d "postgresql:///?host=/var/run/postgresql/" > all.dump
测试版本
hth

在Windows上使用WiX安装应用程序时,如何提供该.pgpass文件?就我所了解的链接文档而言,该文件位于%APPDATA%\postgresql\pgpass.conf下,并且只有一个文件,我必须更改该文件才能添加通过第一个脚本创建的用户。我希望有一种更巧妙的方法可以做到这一点。@derSteve正如链接文档所说,您可以将pgpass文件放在任何您想要的地方,并使用环境变量PGPASSFILE告诉psql(实际上是libpq)在哪里可以找到它。在unix上,pgpass文件不能是组或全局可访问的。在windows上,postgres lib将假定您将其放在一个安全的地方,但不会检查或投诉(因此请保持智能并控制对该文件的权限)。它不会如此保密,每个人都可以从环境变量中看到密码。
pg_dump -Fc "postgresql://username:password@localhost:9001/${db}" > "backup_${db}.pgdump"
 sudo -u postgres pg_dumpall -d "postgresql:///?host=/var/run/postgresql/" > all.dump
# cat /opt/postgresql/PG_VERSION
9.6