今朝、ボードをアップグレードしようとしたところ、エラーが発生しました。
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint “index_users_on_username”
エラーにはユーザー名「MikeC」が記載されていました。そこで調査したところ、postgres_data を復元してボードを再起動し、その後データベース内の重複を確認するよう指示されました。そこで username_lower = 'mikec' に対して簡単なクエリを実行したところ、1 行が返ってきました。その後、以下のような高度なクエリを見つけました。
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 UI に戻ってそのユーザーを検索し、古い方のユーザー名を変更します。重複が見つかるまでこの手順(洗い流して、すすいで、繰り返す)を繰り返します。その後、再構築を実行すれば成功です!
ただし、以下の点について知りたいと考えています:
-
なぜ 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.