【新手向】不应该在PostgreSQL中做的事情

作为一个PostgreSQL初学者的作者,由于犯了一个错误,我变得非常冷汗淋漓。因此,我将其作为备忘录写下来。希望对刚开始学习PostgreSQL的人有所帮助。

这篇文章的受众

・对于PostgreSQL来说还是个新手的人
・正在考虑安装PostgreSQL的人
・想要了解在PostgreSQL中不应该做的事情的人
・删除了超级用户权限后感到后悔的人

行动背景

・Windows 10 -> Windows十
・PostgreSQL 12 -> PostgreSQL 12
・SQL Shell(psql) -> SQL Shell(psql)

安装PostgreSQL12时的初始状态。

模式名称:postgres
数据库名称:postgres
用户(角色):postgres

在PostgreSQL中不应该做的事情。

默认用户并具有超级用户权限的“postgres”用户,不应该删除超级用户权限。

请勿轻率地从当前状态尝试执行以下命令。

postgres=# ALTER ROLE postgres NOSUPERUSER;

在详细阐述的过程中,将加入术语解释来描述内容。

默认用户是在安装时从初始状态创建的用户。在这里,默认用户是指“postgres”用户。
此外,“postgres”也是超级用户和数据库管理用户。
※关于数据库管理用户的说明,我们将不做详述。

超级用户是指具有管理员权限的用户,简单来说,就是拥有可以做任何事情的权限的用户。反过来说,如果不是超级用户,则可能会受到操作的一部分限制。

「postgres=#」的意思是,「#」表示超级用户,如果不是超级用户,则表示为「>」(例如「postgres=>」)。
因此,「postgres=#」表示以数据库「postgres」的超级用户「postgres」身份登录。

关于命令「ALTER ROLE postgres NOSUPERUSER;」,
使用「ALTER ROLE 角色名称 属性」来修改角色的属性。
该命令的意思是将角色「postgres」的属性修改为非超级用户(NOSUPERUSER)。

「角色」和「使用者」这两个词出现了,可以统一考虑。原因是因为在PostgreSQL 9.5.4文档中有这样的规定。

“用户”和”群组”的概念已经被整合到”角色”中
PostgreSQL 9.5.4文档


我想你已经理解了刚才所得出的结论。

请不要从这个状态(超级用户postgres)轻易地执行以下命令(以更改为非超级用户权限)。

 

postgres=# ALTER ROLE postgres NOSUPERUSER;

我将解释为何不能随意敲击的原因。

只有超级用户才能授予超级用户权限。

只有超级用户才能被授予权限,我们可以通过以下步骤进行确认。

使用超级用户“postgres”登录,并创建非超级用户“test”用户。

postgres=# CREATE ROLE test LOGIN PASSWORD 'test';
CREATE ROLE

使用\dg指令来显示角色列表,并确认角色属性。

postgres=# \dg
                                             ロール一覧
 ロール名  |                                   属性                                   | 所属グループ
-----------+--------------------------------------------------------------------------+--------------
 postgres  | スーパユーザ, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス      | {}
 test      |                                                                         | {}

确认了「postgres」处于超级用户状态,而「test」则不是超级用户状态。

3. 登录PostgreSQL,使用用户名”test”。

postgres=# \c - test

从用户“test”处,向用户“test”授予超级用户权限的命令。

postgres=> ALTER ROLE test NOSUPERUSER;
ERROR:  スーパユーザを更新するにはスーパユーザである必要があります

然后,会发生上述错误。
通过这样验证,我们确认只有超级用户才能赋予超级用户权限。

考虑到这一点,如果从超级用户“postgres”中删除超级用户权限,可以想象会发生什么。

是的,失去了将“postgres”恢复为超级用户权限的途径。
请注意,即使是通过pgAdmin也无法恢复。pgAdmin是一种可以使用图形用户界面(GUI)来管理PostgreSQL数据库和用户的工具。

SuperUser postgres的恢复方法

如果可以的话,让我们重新安装吧。

那会很快。
通过这样做,您可以获得超级用户权限,并且可以使用默认用户postgres。

以下是关于恢复方法的额外讨论。
除了重新安装外,我搜索了其他的恢复方法,发现了一些恢复超级用户的方法。
例如,以下是一篇相关文章。

    • PostgreSQLでpostgresを回復する

 

    誤まってPostgreSQLユーザーの権限を削除した場合の対応方法

无论笔者尝试了哪种方法,都无法成功。
这是关于在文章中看到的在使用-D选项执行postges命令的方法,但在PostgreSQL 12.4文档中没有找到相关说明,所以不清楚它是否适用于PostgreSQL 12。
如果有任何方法能够恢复超级用户,我会再次写一篇文章。

应对措施

我认为为了防止这种事情发生,需要以下预防措施。

    • 必ずpostgres以外のユーザを作成する(例:test、test_userなど)。

 

    • デフォルトユーザーであり、且つスーパーユーザーの権限をもつpostgresでは、動作確認は行わない。

 

    ロール属性を変更するALTER ROLEや、権限を付与する「GRANT」、権限を削除する「REVOKE」コマンドを打つ前に、 現在のユーザ(ロール)を確認する(select current_user;)。

写在最后

由于我在本地环境中获得了超级用户权限,所以还有一点救济的机会。
如果这种情况发生在生产环境中,想想就很可怕…。

不仅仅是限于PostgreSQL,删除超级用户(管理员权限)是一件理所当然的事情,但由于粗心大意,我不小心做了这件事,所以我将其留作备忘录和自我警示。

如果能帮助到与我有相同想法的人或者 PostgreSQL 初学者,那就非常幸运了。

仅需要一种选项,请将以下内容以中文进行直接改写:

    [PostgreSQL] よく使うコマンドまとめ

本文中包含有关数据库、表、用户权限和架构的命令。

    PostgresSQLの初期設定

本文中还提到了关于GRANT和REVOKE命令的详细说明。

bannerAds