在没有数据库的情况下验证PostgreSQL用户和密码

4
如何在没有数据库存在的情况下验证postgresql用户和密码是否有效?我正在创建一个自动化安装程序,将创建一个数据库并运行sql脚本来创建表。 在运行脚本之前,需要验证用户和密码。 自动安装调用Windows批处理文件。 首先设置密码,设置PGPASSWORD=mypassword。在设置密码后,有什么命令可以验证用户和密码并返回错误代码或消息吗?其他数据库程序(如IBM和db2)具有一个附加命令,允许用户连接到服务器或实例,而无需指定数据库名称。 我找不到PostgreSQL的等效命令。如何在命令行上登录PostgreSQL而不指定数据库名称?

1
Postgres总是安装一个名为“postgres”的数据库。使用@Eric的答案中提到的那个,你就没问题了。 - mistapink
3个回答

3

使用系统表pg_roles

Postgres始终会安装一个名为“postgres”的数据库。当您没有连接到任何数据库时,该数据库是您要连接的数据库。其中有一个名为pg_roles的表。

请使用以下命令:

psql -U pgadmin -d postgres -c 'select * from pg_roles'

这将返回:

 rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcatupdate | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolconfig |  oid
----------+----------+------------+---------------+-------------+--------------+-------------+----------------+--------------+-------------+---------------+-----------+-------
 postgres | t        | t          | t             | t           | t            | t           | t              |           -1 | ********    |               |           |    10
 pgadmin  | t        | t          | t             | t           | t            | t           | t              |           -1 | ********    |               |           | 16384

(2行)

请参考这个答案:如何检查postgres用户是否存在?

通过登录测试

使用提供的用户名/密码尝试登录并用try/catch语句包围它,如果可以登录,则其有效,否则无效。

更改用户

如果您更改一个不存在的用户,则可能会捕获到错误消息:http://www.postgresql.org/docs/8.0/static/sql-alteruser.html

ALTER USER postgres WITH PASSWORD 'tmppassword';

删除并重新添加用户

如果您尝试删除并重新添加用户,则可能会捕获错误消息。因此,如果无效,则在尝试删除非用户时会引发错误。 http://www.postgresql.org/docs/8.0/static/sql-createuser.html


所以你想在设置postgresql系统表之前验证用户是否有效?这似乎有点奇怪,但没问题。 - Nelson Jarvis
自动化安装正在创建一个新的数据库,然后运行脚本来创建表并加载数据。屏幕提示输入凭据,并需要在调用createdb命令之前进行身份验证。没有必要使用错误的凭据运行其他命令。这是数据库安装的标准做法。 - Nelson Jarvis
登录到PostgreSQL:其他数据库程序(如IBM db2)具有附加命令,允许用户附加到服务器或实例,而无需指定数据库名称。我找不到PostgreSQL的等效项。如何在命令行上登录到PostgreSQL而不指定数据库名称? - Nelson Jarvis
1
连接到数据库:postgres。当您不连接到数据库时,它是您连接的数据库。 - Chris Aitchison

1

以下是一个方便的方法,可以从命令行检查用户名/密码组合是否有效。这是从puppetlabs-postgresql模块中提取的:

su - username
env PGPASSWORD=somepass psql -h localhost -c 'select 1'
echo $?

...其中'somepass'是正在测试的密码,'username'是正在与之进行测试的帐户(通常是postgres用户本身)。

如果$?为0,则用户/密码组合有效。 如果$?为1,则密码错误或用户不存在。 无论哪种方式,都存在问题。

这是Linux/bash的方式。 Windows的方式大致如下:

(run under the user account you're interested in)

set PGPASSWORD=somepass
psql -h localhost -c 'select 1'

if errorlevel 1 (
    echo Failure Reason Given is %errorlevel%
    exit /b %errorlevel%
)

使用psql的-h参数可以强制进行本地TCP连接,默认情况下(来自pg_hba.conf),这会强制进行密码检查,没有可能让无需密码的用户绕过。
非常抱歉我没有发布完全测试过的Windows解决方案,但是上面的代码很有可能直接工作或只需要稍加修复。

-2

在终端中简单地使用此命令:

psql postgres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接