Duplicated entry - unique constraint violated

お困りですか?

アトラシアン コミュニティをご利用ください。

コミュニティに質問

プラットフォームについて: サーバーと Data Center のみ。この記事は、サーバーおよび Data Center プラットフォームのアトラシアン製品にのみ適用されます。

問題

ログに次のようなスタック トレースが含まれる場合があります。

Caused by: org.ofbiz.core.entity.GenericEntityException: while inserting: [GenericEntity:GlobalPermissionEntry][group_id,BED-Jira-Access][permission,USE][id,10015] (SQL Exception while executing the following:INSERT INTO globalpermissionentry (ID, PERMISSION, GROUP_ID) VALUES (?, ?, ?) (Duplicate entry '10015' for key 'PRIMARY'))
    at org.ofbiz.core.entity.GenericDAO.singleInsert(GenericDAO.java:214)
    at org.ofbiz.core.entity.GenericDAO.insert(GenericDAO.java:179)
Caused by: org.ofbiz.core.entity.GenericEntityException: while inserting: [GenericEntity:GadgetUserPreference][id,60081][userprefvalue,assignees][userprefkey,ystattype][portletconfiguration,13951] (SQL Exception while executing the following:INSERT INTO gadgetuserpreference (ID, PORTLETCONFIGURATION, USERPREFKEY, USERPREFVALUE) VALUES (?, ?, ?, ?) (ORA-00001: unique constraint (JIRAPROD.PK_GADGETUSERPREFERENCE) violated
))
    at org.ofbiz.core.entity.GenericDAO.singleInsert(GenericDAO.java:136)
    at org.ofbiz.core.entity.GenericDAO.insert(GenericDAO.java:101)
Caused by: com.atlassian.jira.exception.DataAccessException: org.ofbiz.core.entity.GenericEntityException: while inserting: [GenericEntity:PortletConfiguration][position,0][id,14485][portalpage,12305][color,color1][gadgetXml,rest/gadgets/1.0/g/com.atlassian.jira.gadgets:admin-gadget/gadgets/admin-gadget.xml][columnNumber,0] (SQL Exception while executing the following:INSERT INTO portletconfiguration (ID, PORTALPAGE, PORTLET_ID, COLUMN_NUMBER, positionseq, GADGET_XML, COLOR) VALUES (?, ?, ?, ?, ?, ?, ?) (ORA-00001: unique constraint (JIRAPROD.PK_PORTLETCONFIGURATION) violated
2013-08-05 10:46:05,050 http-bio-8080-exec-2838 ERROR [500ErrorPage.jsp] Exception caught in 500 page org.ofbiz.core.entity.GenericEntityException: while inserting: [GenericEntity:ApplicationUser][id,10002][userKey,oarteaga][lowerUserName,oarteaga] (SQL Exception while executing the following:INSERT INTO app_user (ID, user_key, lower_user_name) VALUES (?, ?, ?) (Duplicate entry '10002' for key 1))
com.atlassian.jira.exception.DataAccessException: org.ofbiz.core.entity.GenericEntityException: while inserting: [GenericEntity:ApplicationUser][id,10002][userKey,oarteaga][lowerUserName,oarteaga] (SQL Exception while executing the following:INSERT INTO app_user (ID, user_key, lower_user_name) VALUES (?, ?, ?) (Duplicate entry '10002' for key 1))
Caused by: org.ofbiz.core.entity.GenericEntityException: while inserting: [GenericEntity:Membership][id,82263][membershipType,GROUP_USER][lowerParentName,nicr][parentId,80014][childId,42310][childName,lhooipen][lowerChildName,lhooipen][directoryId,10100][parentName,NICR] (SQL Exception while executing the following:INSERT INTO cwd_membership (ID, parent_id, child_id, membership_type, group_type, parent_name, lower_parent_name, child_name, lower_child_name, directory_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) (ORA-00001: unique constraint (JIRAUSER.PK_CWD_MEMBERSHIP) violated


診断

エラー メッセージでは、問題を返しているエンティティとそれに対応するテーブルを次のように確認できます。

org.ofbiz.core.entity.GenericEntityException: while inserting: [GenericEntity:Membership]

...
SQL Exception while executing the following:INSERT INTO cwd_membership

この例では、問題のエンティティは Membership で、対応するテーブルが cwd_membership であることがわかります。これにより、データベースで次のクエリを実行できます。

SELECT * FROM sequence_value_item WHERE seq_name = 'Membership';
SELECT max(id) FROM cwd_membership;


2 つめのクエリで返される値が 1 つめのクエリで返されるものよりも大きい場合、この問題の修正のためにソリューションの手順をご確認ください。これに該当しない場合は代替ソリューションをご確認ください。

利用されているテーブルの名前はエンティティの名前にほぼ一致します。ただし場合によっては名前が完全に一致しないことがあるため、上の例のように類似した名前を探す必要があることがあります。ご利用のデータベースのテーブル名では大文字と小文字が区別される点にご注意ください。sequence_value_item の代わりに SEQUENCE_VALUE_ITEM の利用が必要になることがあります。

SQL クエリで数値ソートの利用が必要になる可能性があります。例:

MySQL クエリ

SELECT max(CAST(id AS SIGNED)) FROM cwd_membership;

PostgreSQL クエリ
SELECT max(id::integer) FROM cwd_membership;

原因

この問題の原因はまだはっきりしていませんが、更新試行が正常に完了せず、id 数の不一致につながった可能性が考えられます。

ソリューション

データベースの変更を行う場合は 必ず事前にバックアップを取得してください。可能な場合はテスト サーバーで変更を試すことをおすすめします。

  1. Jira アプリケーションをシャットダウンします。
  2. データベースで次のクエリを実行します。

    UPDATE sequence_value_item SET seq_id = (SELECT max(id)+100 FROM <TableName>) WHERE seq_name = '<EntityName>';

    Oracle データベースをご利用の場合は変更のコミットを忘れないようにしてください。

     '<EntityName>' と <TableName> を、エラー メッセージで表示された値で置き換えるようにします。

  3. Jira アプリケーションを再起動します。

たとえば、上の例の問題を修正するために利用される更新ステートメントは次のようになります。

UPDATE sequence_value_item SET seq_id = (SELECT max(id)+100 FROM cwd_membership) WHERE seq_name = 'Membership'; 

代替ソリューション

シーケンス値が対象のテーブルの最大 ID よりも大きい (および失敗する ID 番号がすでに存在する) 場合は Jira の再起動をお試しください。

場合によって、Jira がデータベースを参照するのではなく次の ID 番号を内部で生成することがあります。このメモリ内の値がデータベース内の情報に対応していないとデータベース挿入に失敗します。

Jira を再起動することで、Jira でデータベースの内容を再度読み取り、適切な ID を生成できます。

説明ログに "Duplicated entry - unique constraint violated" のエラーが返される状況の場合、問題の解決にこの記事をご利用いただけます。
製品Jira
プラットフォームサーバー
最終更新日: 2021 年 10 月 27 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.