运行"grant connect on database"时"row is too big (...) maximum size 8160"



我在 postgres 11 中遇到了奇怪的问题。

我正在创建一堆用户,然后为他们分配一些角色,但也让他们连接到某个数据库。

成功创建 2478 个角色后,当我尝试创建新用户时,出现此错误:

db=# create user foo;
CREATE ROLE
db=# grant connect on database db to foo;
ERROR:  row is too big: size 8168, maximum size 8160

数据库日志中显示相同的错误。

我检查了 db 卷是否空间不足,那里还有 1T 可以闲置......

我无法想象在运行简单授权时试图插入超过 8k 的 postgres ......?


编辑:

似乎已经提出了类似的问题(模式的使用权限(:

错误:行太大:大小为 8168,最大大小为 8164

因此,解决方案是创建一个角色,例如connect_to_my_db并授予对该角色的连接,然后而不是对每个用户运行GRANT connect 执行GRANT connect_to_my_db

您自己找到了解决方案,让我添加错误原因的解释:

每个表行都存储在表的 8KB 块之一中,因此这是其大小限制。

普通表具有 TOAST 表,其中的长属性可以行外存储。这允许PostgreSQL存储非常长的行。

现在,系统目录表没有 TOAST 表,因此行的大小限制为 8KB。

对象的

访问控制列表存储在对象的目录中,因此对表的许多权限可能会超过限制。

很高兴 - 如果您必须单独管理数千个用户的权限,那么您最终都会陷入DBA地狱。

最新更新