所以我今天早上尝试升级我的板子时遇到了一个错误:
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint “index_users_on_username”
错误提示涉及用户 “MikeC”。于是我深入调查了一下,建议我恢复 postgres_data 并重新启动我的板子,然后检查数据库中是否存在重复项。于是我运行了一个简单的查询 username_lower = 'mikec',结果只找到了一行。接着我找到了这个更高级的查询:
SELECT username_lower, count(*) from users GROUP by username_lower HAVING count(*) > 1;
但该查询没有返回任何行。那么重复项究竟在哪里呢?任何帮助都将不胜感激。我目前使用的是旧数据,但希望能正确地重建应用程序。
1 个赞
以下是我解决问题的方法,但相信肯定有更好的办法:
我进入管理后台,搜索“MikeC”,结果返回了 2 个用户。于是我将最旧的那个用户名重命名,并没有再次运行重建,而是直接登录数据库并重新索引:
cd /var/discourse
./launcher enter app
sudo -i postgres psql discourse
discourse# REINDEX SCHEMA CONCURRENTLY public;
如果这提示存在另一个重复用户,我会返回 Web 界面,搜索该用户并重命名较旧的那个。如此循环往复,直到找不到重复用户为止。然后执行重建,即可成功!
不过,我仍希望了解以下两点:
-
为什么 Discourse 会允许重复用户存在?用户名虽然不区分大小写,但 username_lower 应被规范化为唯一值。这似乎是一个相当严重的漏洞。
-
有没有更好的方法来查找并修复这些重复用户?
2 个赞
pfaffman
(Jay Pfaffman)
3
我认为没有更好的办法了。重复的用户名是不允许的,但似乎之前的某个漏洞没有执行小写检查。最近还有一个关于此问题的讨论。
2 个赞
system
(system)
关闭
4
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.