2012-06-14 53 views
4

在安装我的应用程序期间,我想创建一个PostgreSQL数据库以及一些表和函数。如何在没有用户输入/密码的情况下从命令行执行PostgreSQL脚本文件

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

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

为了进一步说明环境。我使用WiX 3.5安装程序作为“MSI-Builder”。

回答

5

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

您可以提供一个.pgpass文件来支持自动脚本验证。这里是the docs

+0

在Windows上使用WiX安装我的应用程序期间,如何能够提供.pgpass文件?据我了解链接的文档,该文件驻留在%APPDATA%\ postgresql \ pgpass.conf并且将只有一个文件,我将不得不更改为添加已通过第一个脚本创建的用户。我希望这样做有一个很好的方法。 – derSteve

+0

@derSteve正如链接文档所说,您可以将pgpass文件放在任何地方,并使用环境变量PGPASSFILE告诉psql(真正的libpq)在哪里找到它。在unix上,pgpass文件不能是组或世界可访问的。在Windows上,postgres lib会假设你把它放在一个安全的地方,但不会检查或抱怨(所以要聪明并控制文件的权限)。 – dbenhur

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; 
相关问题