我在使用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
数据库日志中显示相同的错误。
我检查了数据库卷是否没有足够的空间,还有1T的备用空间...
我无法想象postgres在运行简单授权时试图插入超过8k的内容...?
编辑:
似乎已经问过类似的问题(在模式上使用特权):
ERROR: row is too big: size 8168, maximum size 8164
因此解决方案是创建一个角色,例如说connect_to_my_db
并授予与该角色的连接,然后不对每个用户运行GRANT connect
来执行GRANT connect_to_my_db
。
答案 0 :(得分:1)
您自己找到了解决方案,请允许我添加一下错误原因的说明:
每个表行都存储在表的8KB块之一中,因此这是其大小限制。
普通表具有 TOAST表,其中长属性可以脱机存储。这使PostgreSQL可以存储很长的行。
现在系统目录表没有TOAST表,因此行数限制为8KB。
对象的访问控制列表存储在对象的目录中,因此对表的许多权限都可能超出限制。
很高兴-如果您必须分别管理成千上万个用户的权限,那么无论如何您最终都会陷入DBA地狱。