DB内の重複ユーザー名に関するアップグレードの問題

今朝、ボードをアップグレードしようとしたところ、エラーが発生しました。

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 に戻ってそのユーザーを検索し、古い方のユーザー名を変更します。重複が見つかるまでこの手順(洗い流して、すすいで、繰り返す)を繰り返します。その後、再構築を実行すれば成功です!

ただし、以下の点について知りたいと考えています:

  1. なぜ Discourse は重複ユーザーを許可するのでしょうか?ユーザー名は大文字小文字を区別しない設定ですが、username_lower は本来一意であるべき値に正規化されます。これはかなり重大なバグのように思えます。

  2. これらの重複ユーザーを特定し、修正するより良い方法は何でしょうか?

「いいね!」 2

これ以上の良い方法はないと思います。重複したユーザー名は許可されていませんが、過去のバグにより、小文字化チェックが適切に実行されていなかったようです。これについて最近、別のトピックでも話題になりました。

「いいね!」 2

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.