Jira Cloud Migration Assistant (JCMA) ですべてのボードとフィルターを移行する方法

お困りですか?

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

コミュニティに質問

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

 

目的

このドキュメントでは、プロジェクト横断ボードを Jira Cloud Migration Assistant (JCMA) 経由で移行するための最新の機能フラグの利用方法をご説明します。

重要: 機能フラグは実験的に提供されているものです。これらの機能フラグによって移行が破損してしまった場合、当社は可能な限りの支援を提供しますが、修正やインシデント対応を保証することはできません。機能フラグはあらゆるエッジ ケースを網羅しているわけではありません。このような機能フラグの利用が唯一の選択肢である場合、機能フラグを有効化した状態で移行の完全なテストを行ってください。機能フラグの利用で問題が発生した場合は手動の回避策をご検討ください。

機能フラグが有効化されている場合、JCMA ですべてのプロジェクト横断ボードやフィルターの移行状況は表示されません。代わりに次のように表示される場合があります。

  • 移行の詳細に含まれるすべての項目で緑色のチェックマークが表示されている

  • 移行ステークホルダーが Migration running または Migration incomplete (インポート側のエラーが発生した場合、または最後の CROSS_PROJECT_DATA 手順)

要約

Jira Cloud Migration Assistant は現在も開発が続けられているため、デフォルトですべてのデータが移行されるわけではありません。

JCMA で移行されるオブジェクトと移行されないオブジェクトの包括的な一覧をこちらで確認していただけます。Jira Cloud Migration Assistant で移行される情報

この記事では次のようなオブジェクトに対応します。

  • プロジェクト横断ボード

  • 移行対象のプロジェクトに接続されていないボード

  • 非アクティブなユーザーや削除されたユーザーに紐づくボード/フィルター

  • 移行されないボードのフィルター

環境

Jira 7.6 以降

Jira Cloud Migration Assistant バージョン 1.7.1 以降

サニティー チェック

The admin user running the migration plan in JCMA must have the "Browse Project" Permission on all projects that are being migrated. See the MIG-1089 bug linked at the end of this KB for further reference.

Before we can migrate all boards and filters, there are some sanity checks (and minor fixes) apart from the project permission check above, that are required to be done on Jira Server's database.

JCMA は、ボードのフィルターが単一のプロジェクトに紐づく場合にのみ、ボードをプロジェクトに割り当てます。JCMA はプロジェクト横断ボードやフィルターの移行時、これらのボードの所属先をボード管理者 (所有者) に設定します。

ボード管理者またはフィルター所有者が非アクティブな場合、JCMA によって適切なプロジェクトが場所として割り当てられない可能性があります。このため、ボードやフィルターを安全に移行するためにこのような詳細を確認しておくことをおすすめします。

すべてのボードやフィルターの移行を開始する前にいくつかの点を考慮する必要があります。

  1. ボードが有効なフィルターに関連付けられていること

  2. ボードの列が有効なステータスに関連付けられていること

  3. クイック フィルターの無効な JQL が修正されていること

  4. 共有権限設定に有効なグループがあること
  5. すべてのフィルターで、メール アドレスなどの個人情報が取り除かれていること

  6. 非アクティブなユーザーや削除されたユーザーによって所有/作成されたボードやフィルターが有効な所有者に割り当てられていること

ダーク機能/機能フラグ

Migrating cross-project boards and filters is implemented as Feature Flags (also known as Dark Features) and is not enabled in JCMA by default. See Enable Dark Feature in Jira for instructions on how to use feature flags.

すべてのチェックと変更 (以降のセクションを参照) が完了してからのみ、Jira Server のインスタンスで以下の 2 つのダーク機能を適用してください。

JCMA ですべてのボードとフィルターを移行するためのダーク機能
com.atlassian.jira.migration.export.all.filters
com.atlassian.jira.migration.export.multiprojects.boards

ダーク機能 com.atlassian.jira.migration.export.shared.filters のサポートは終了しています。com.atlassian.jira.migration.export.all.filters統合されています。上記2つのダーク機能のみを追加してください。

これらのダーク機能を適用するには、ご利用の Jira Server インスタンスで次の手順を実行します。

  • 次の URL に移動します。

    ${Jira_URL}/secure/admin/jira/views/SiteDarkFeatures!default.jspa
  • 上記のダーク機能を追加します。
  • [追加] をクリックします (Jira の再起動は不要です)

Make sure to use the two Dark Features in only one JCMA plan (see the two suggested approaches below and choose one).

上記のダーク機能を有効化した状態で、最初のプランですべてのボードを移行すると、JCMA はすべてのボードを移行し、それらをプロジェクトの場所にリンクしようとします。リンクできない場合、一時的にボード所有者の場所に保持します。

しかし、他のプロジェクト用の他のプランが実行されると、それらの移行でボードを適切な場所に配置するような調整が行われます。

複数のプランにこれらのダーク機能を含めた場合、移行済みのすべてのボードが再度更新され、プランの内容に応じて個々のユーザーの場所に配置されます。

従って、以下の 2 つのうちのいずれかを選択いただくのが推奨の進め方となります。

  1. 上記 2 つのダーク機能を有効化する
  2. 完全な JCMA 移行プラン (すべてのプロジェクト) を実行する
  3. 上記 2 つのダーク機能を無効化する

または

  1. 2 つのダーク機能はまだ有効化しない
  2. JCMA でデータを移行する ( お客様によっての最適なシナリオに応じて、1 つまたは複数のプラン)
  3. すべてのデータを移行したら、2 つのダーク機能を有効化する
  4. 課題 1 つだけのダミープロジェクトを Jira Server に作成する
  5. JCMA 移行プランを、ダミープロジェクトのみを含めて実行する
  6. 完了したら、このボード/フィルター用の 2つのダーク機能を無効化する

先に進む前に

以降の変更では、DB 管理者または SELECT/DELETE/UPDATE SQL クエリの実行方法を知っているユーザーが必要です。

データベース レベルでデータを変更するため、変更内容に特に注意を払ってください。

データベースの変更を行う場合は必ず事前にバックアップを取得してください。可能な場合は、まずステージング サーバーで SQL コマンドの変更、挿入、更新、または削除を行うようにします。

存在しないフィルターにリンクされているボード

Jira 管理者が DB からオブジェクトを削除した場合や、Jira のバージョンが古い場合は、これによってデータの整合性が失われる可能性があります。また、存在しなくなったフィルターにボードがリンクするような不一致につながる可能性もあります。

さらに、移行を実行する Jira 管理者が UI 経由で対象のフィルターやボードを見つけて修正するための権限 (DB レベルで権限を変更して Jira を再起動した場合を除く) を持っていない可能性があります。

この問題を修正するには複数の方法があり、以降では主な推奨事項として 2 つのアプローチを記載しています。

検出
PostgreSQL
SELECT DISTINCT 
       rv."ID"              AS "Board ID"
     , rv."NAME"            AS "Board Name"
     , rv."OWNER_USER_NAME" AS "Board Owner"
     , ba."RAPID_VIEW_ID"   AS "Foreign Key ID from the Board Admins table"
  FROM "AO_60DB71_RAPIDVIEW" rv
  LEFT JOIN searchrequest sr ON (rv."SAVED_FILTER_ID" = sr.id)
  LEFT JOIN "AO_60DB71_BOARDADMINS" ba ON (rv."ID" = ba."RAPID_VIEW_ID")
 WHERE NOT EXISTS ( SELECT *
                      FROM searchrequest
                      WHERE id = rv."SAVED_FILTER_ID" )
 ORDER BY rv."ID";
Oracle、MySQL、MSSQL
SELECT DISTINCT 
       rv.ID              AS "Board ID"
     , rv.NAME            AS "Board Name"
     , rv.OWNER_USER_NAME AS "Board Owner"
     , ba.RAPID_VIEW_ID   AS "Foreign Key ID from the Board Admins table"
  FROM AO_60DB71_RAPIDVIEW rv
  LEFT JOIN searchrequest sr ON (rv.SAVED_FILTER_ID = sr.id)
  LEFT JOIN AO_60DB71_BOARDADMINS ba ON (rv.ID = ba.RAPID_VIEW_ID)
 WHERE NOT EXISTS ( SELECT *
                      FROM searchrequest
                      WHERE id = rv.SAVED_FILTER_ID )
 ORDER BY rv.ID;
修正 1 - 問題があるボードを削除

"AO_60DB71_BOARDADMINS" テーブルに存在するボード ID がある場合、まずそこからの削除を行う必要があります。これを行わないと、"AO_60DB71_RAPIDVIEW" テーブルからボードを削除するときに外部キー制約エラーが発生します。

対象のボードを検出する上記のクエリで "AO_60DB71_BOARDADMINS" テーブルのデータも取得しているのは、このためです。これは、必要に応じて削除が必要な ID を特定するのに役立ちます。

この場合は、まず、"AO_60DB71_BOARDADMINS" テーブルからボードを削除します。

PostgreSQL
DELETE FROM "AO_60DB71_BOARDADMINS" WHERE "RAPID_VIEW_ID" = <ID of the offending Board>;
Oracle, MySQL, MSSQL Server
DELETE FROM AO_60DB71_BOARDADMINS WHERE RAPID_VIEW_ID = <ID of the offending Board>;
PostgreSQL
DELETE
  FROM "AO_60DB71_RAPIDVIEW" USING "AO_60DB71_RAPIDVIEW" rv
  LEFT JOIN searchrequest sr ON (rv."SAVED_FILTER_ID" = sr.id)
 WHERE "AO_60DB71_RAPIDVIEW"."ID" = rv."ID"
   AND NOT EXISTS ( SELECT *
                      FROM searchrequest
                     WHERE id = rv."SAVED_FILTER_ID" );
Oracle
DELETE 
  FROM AO_60DB71_RAPIDVIEW rv
WHERE EXISTS ( SELECT rv.ID
                 FROM AO_60DB71_RAPIDVIEW rv
                 LEFT JOIN searchrequest sr ON (rv.SAVED_FILTER_ID = sr.id)
                WHERE NOT EXISTS ( SELECT *
                                     FROM searchrequest
                                    WHERE id = rv.SAVED_FILTER_ID ))
MySQL、MSSQL
DELETE rv
  FROM AO_60DB71_RAPIDVIEW rv
  LEFT JOIN searchrequest sr ON (rv.SAVED_FILTER_ID = sr.id)
 WHERE NOT EXISTS ( SELECT *
                      FROM searchrequest
                      WHERE id = rv.SAVED_FILTER_ID );
修正 2 - ダミー フィルターを作成し、問題のあるボードをそれに関連付け

UI でフィルターを作成します。次に以降の SELECT SQL 文を実行して対象のフィルター ID を取得します。これは、問題のあるボードをリンクするのに使います。

フィルター ID が得られたら以降の UPDATE 文を利用し、問題のあるボードを新しいダミー フィルターに再関連付けすることがあります。

PostgreSQL、Oracle、MySQL、MSSQL
SELECT id FROM searchrequest WHERE filtername = '<dummy filter name>';
PostgreSQL
UPDATE "AO_60DB71_RAPIDVIEW" rv
   SET "SAVED_FILTER_ID" = <filter ID from the SELECT above>
 WHERE NOT EXISTS ( SELECT id FROM searchrequest WHERE id = rv."SAVED_FILTER_ID" );
Oracle、MySQL、MSSQL
UPDATE AO_60DB71_RAPIDVIEW
   SET SAVED_FILTER_ID = <filter ID from the SELECT above>
 WHERE NOT EXISTS ( SELECT id FROM searchrequest WHERE id = AO_60DB71_RAPIDVIEW.SAVED_FILTER_ID );

存在しないステータスにリンクされたボード列

参考: JCMA の移行後のログに含まれる次のようなエラーを見つけることができます。

project-export Board '<board name>' has columns with missing statuses. Missing statuses are: <status 1>=[10010], <status 2>=[10011], <status 3>=[10012]. Remove the columns OR change the column statuses.
検出

管理者は以降の SQL で、存在しないステータス ID を持つすべてのボード列ステータスを得られます。

PostgreSQL
SELECT rv."ID"   AS "Board ID"
     , rv."NAME" AS "Board Name"
     , c."NAME"  AS "Column Name"
     , i.pname   AS "Issue Status Name"
FROM "AO_60DB71_RAPIDVIEW" rv
JOIN "AO_60DB71_COLUMN" c ON (rv."ID" = c."RAPID_VIEW_ID")
JOIN "AO_60DB71_COLUMNSTATUS" cs ON (c."ID" = cs."COLUMN_ID")
LEFT JOIN issuestatus i ON (i.id = cs."STATUS_ID")
WHERE NOT EXISTS ( SELECT id 
                     FROM issuestatus 
                    WHERE id = cs."STATUS_ID" );
Oracle、MySQL、MSSQL
SELECT rv.ID   AS "Board ID"
     , rv.NAME AS "Board Name"
     , c.NAME  AS "Column Name"
     , i.pname AS "Issue Status Name"
FROM AO_60DB71_RAPIDVIEW rv
JOIN AO_60DB71_COLUMN c ON (rv.ID = c.RAPID_VIEW_ID)
JOIN AO_60DB71_COLUMNSTATUS cs ON (c.ID = cs.COLUMN_ID)
LEFT JOIN issuestatus i ON (i.id = cs.STATUS_ID)
WHERE NOT EXISTS ( SELECT id 
                     FROM issuestatus 
                    WHERE id = cs.STATUS_ID );
修正 1 - Jira UI でボード (上記の SELECT SQL 文の出力に記載されたもの) を開いて削除
修正 2 - データベースから対象の列を直接削除
PostgreSQL - ボード列ステータス
DELETE
  FROM "AO_60DB71_COLUMNSTATUS" col
 WHERE NOT EXISTS ( SELECT * FROM issuestatus WHERE id = col."STATUS_ID" );
PostgreSQL - ボード列
DELETE
  FROM "AO_60DB71_COLUMN" col
 WHERE NOT EXISTS ( SELECT * FROM "AO_60DB71_COLUMNSTATUS" WHERE "COLUMN_ID" = col."ID" );
Oracle - ボード列ステータス
DELETE
  FROM AO_60DB71_COLUMNSTATUS col
 WHERE NOT EXISTS ( SELECT * FROM issuestatus WHERE id = col.STATUS_ID );
Oracle - ボード列
DELETE
  FROM AO_60DB71_COLUMN col
 WHERE NOT EXISTS ( SELECT * FROM AO_60DB71_COLUMNSTATUS WHERE COLUMN_ID = col.ID );
MySQL、MSSQL - ボード列ステータス
DELETE col
  FROM AO_60DB71_COLUMNSTATUS col
 WHERE NOT EXISTS ( SELECT * FROM issuestatus WHERE id = col.STATUS_ID );
MySQL、MSSQL - ボード列
DELETE col
  FROM AO_60DB71_COLUMN col
 WHERE NOT EXISTS ( SELECT * FROM AO_60DB71_COLUMNSTATUS WHERE COLUMN_ID = col.ID );

クイック フィルター内の無効な JQL

クイック フィルター内の個人情報を確認することをおすすめします。これが存在するとインポート プロセスで次のようなエラーが生成される可能性があります。

無効な JQL のエラー
project-import We couldn't import Board <Board ID>. Reason: JQL in quick filter is invalid: Invalid JQL: Error in the JQL Query: The character '@' is a reserved JQL character. You must enclose it in a string or use the escape '\u0040' instead. (line 1, character 34).

この項目についてデータベースで行える修正方法はありません。クイック フィルターの JQL を更新してサポートされていない文字を削除する必要があります。

検出
PostgreSQL
SELECT rv."NAME" AS "Board Name"
     , qf."NAME" AS "Quick Filter Name"
 FROM "AO_60DB71_RAPIDVIEW" rv
INNER JOIN "AO_60DB71_QUICKFILTER" qf ON (rv."ID" = qf."RAPID_VIEW_ID")
 WHERE qf."LONG_QUERY" LIKE '%@%';
Oracle、MySQL、MSSQL
SELECT rv.NAME AS "Board Name"
     , qf.NAME AS "Quick Filter Name"
 FROM AO_60DB71_RAPIDVIEW rv
INNER JOIN AO_60DB71_QUICKFILTER qf ON (rv.ID = qf.RAPID_VIEW_ID)
 WHERE qf.LONG_QUERY LIKE '%@%';

共有権限に無効なグループがある

共有権限設定でグループが参照されているが、そのグループ自体が Jira に存在しなくなっている場合があります。このクエリで、これらの無効なグループをすべて列挙します。

以下の方法でこれを修正できる可能性があります。

  1. Jira Server でこれらのグループを再作成する

  2. これらの共有権限エントリを削除する (フィルター/ボード/プロジェクトを編集し、権限設定にある無効なグループへの参照を削除する)。

  3. 共有権限のグループを置き換える (上記と同様だが、参照を削除するのではなく、有効なグループと置き換える)

検出
PostgreSQL, Oracle, MySQL, MSSQL Server
SELECT sr.filtername AS filter_name
     , sp.entitytype AS bla
     , sp.param1     AS group_name
  FROM searchrequest sr
  JOIN sharepermissions sp ON (sr.id = sp.entityid)
 WHERE sp.entitytype = 'SearchRequest'
   AND sp.sharetype = 'group'
   AND NOT EXISTS ( SELECT id FROM cwd_group g WHERE g.group_name = sp.param1 )

フィルターに含まれるメール アドレスなどの個人情報

フィルター内の個人情報を確認することをおすすめします。これが存在するとインポート プロセスで次のようなエラーが生成される可能性があります。

フィルター内の個人情報
Project-import We couldn't import Filter 'FILTER NAME'. Reason: Failed to sanitize personal data from query

この項目についてデータベースで行える修正方法はありません。クイック フィルターの JQL を更新してユーザーの個人情報を削除する必要があります。

検出
PostgreSQL、Oracle、MySQL、MSSQL
SELECT * FROM searchrequest WHERE reqcontent LIKE '%@%';

非アクティブなユーザーや削除されたユーザーが所有するボード/フィルター

非アクティブなユーザーや存在しないユーザーが所有するボード/フィルターがあると、JCMA で次のようなエラーが返されます。

Unsupported	CAP	Board	"FILTER_NAME" [985]	Cross-project board	Boards that reference multiple projects are not supported via migration. This board will not be migrated.	If you require this board, re-create the board in your cloud site. To pull out the JQL for board filters, run SQL queries from this page: https://confluence.atlassian.com/jirakb/troubleshooting-errors-and-non-migrated-entities-with-the-jira-cloud-migration-assistant-1021239878.html

Reference:  MIG-736 - Getting issue details... STATUS

非アクティブなユーザーが所有するボード

検出
PostgreSQL
SELECT rv."NAME"               AS "Board name"
     , cwu.lower_user_name     AS "Board inactive owner username"
     , cwu.lower_email_address AS "Board inactive owner email address"     
     , cwu.display_name        AS "Board inactive owner display name"
     , au.user_key             AS "Board inactive owner user key"
  FROM cwd_user cwu
 INNER JOIN app_user au         ON (cwu.lower_user_name = au.lower_user_name)
  JOIN "AO_60DB71_RAPIDVIEW" rv ON (rv."OWNER_USER_NAME" = cwu.lower_user_name OR rv."OWNER_USER_NAME" = au.user_key)
 WHERE cwu.active = 0
 ORDER BY rv."ID";
Oracle、MySQL、MSSQL
SELECT rv.NAME                 AS "Board name"
     , cwu.lower_user_name     AS "Board inactive owner username"
     , cwu.lower_email_address AS "Board inactive owner email address"     
     , cwu.display_name        AS "Board inactive owner display name"
     , au.user_key             AS "Board inactive owner user key"
  FROM cwd_user cwu
 INNER JOIN app_user au       ON (cwu.lower_user_name = au.lower_user_name)
  JOIN AO_60DB71_RAPIDVIEW rv ON (rv.OWNER_USER_NAME = cwu.lower_user_name OR rv.OWNER_USER_NAME = au.user_key)
 WHERE cwu.active = 0
 ORDER BY rv.ID;
修正 1 - Jira UI でボード (上記の SELECT SQL 文の出力に記載されたもの) を開いて所有者を手動で変更。これが行えない場合は以降の DB 修正のアプローチに進みます。
修正 2 - データベースから直接ボードを更新して所有者をアクティブ ユーザーに変更

問題のあるボードのボード所有者として、非アクティブなユーザーの代わりにアクティブな Jira ユーザーを選択するようにしてください。

MySQL ERROR 1175 が返される場合は次の記事をご確認ください。MySQL error code: 1175 during UPDATE in MySQL Workbench

PostgreSQL
UPDATE "AO_60DB71_RAPIDVIEW"
   SET "OWNER_USER_NAME" = '<user name that will be the new owner of these boards>'
 WHERE "ID" IN ( SELECT rv."ID"
                   FROM cwd_user cwu
                  INNER JOIN app_user au ON (cwu.lower_user_name = au.lower_user_name)
                   JOIN "AO_60DB71_RAPIDVIEW" rv ON (rv."OWNER_USER_NAME" = cwu.lower_user_name OR rv."OWNER_USER_NAME" = au.user_key)
                  WHERE cwu.active = 0 );
Oracle、MSSQL Server
UPDATE AO_60DB71_RAPIDVIEW
   SET OWNER_USER_NAME = '<user name that will be the new owner of these boards>'
 WHERE ID IN ( SELECT rv.ID
                 FROM cwd_user cwu
                INNER JOIN app_user au ON (cwu.lower_user_name = au.lower_user_name)
                 JOIN AO_60DB71_RAPIDVIEW rv ON (rv.OWNER_USER_NAME = cwu.lower_user_name OR rv.OWNER_USER_NAME = au.user_key)
                WHERE cwu.active = 0 );
MySQL
SET SQL_SAFE_UPDATES = 0;

UPDATE AO_60DB71_RAPIDVIEW
   SET OWNER_USER_NAME = '<user name that will be the new owner of these boards>'
 WHERE ID IN ( SELECT ID
                 FROM ( SELECT rv.ID
                          FROM cwd_user cwu
                         INNER JOIN app_user au ON (cwu.lower_user_name = au.lower_user_name)
                          JOIN AO_60DB71_RAPIDVIEW rv ON (rv.OWNER_USER_NAME = cwu.lower_user_name OR rv.OWNER_USER_NAME = au.user_key)
                         WHERE cwu.active = 0 ) AS t );

SET SQL_SAFE_UPDATES = 1;

非アクティブなユーザーが所有するフィルター

検出
PostgreSQL, MySQL
SELECT DISTINCT sr.filtername  AS "Filter name"
     , sr.username             AS "Filter username"
     , sr.authorname           AS "Filter author"
     , cwu.lower_email_address AS "Filter inactive user email address"
     , cwu.display_name        AS "Filter inactive user display name"
     , au.user_key             AS "Filter inactive user user key"
     , CASE WHEN cwu.active = 0 THEN 'Inactive' ELSE 'Active' END AS "User status"
     , sr.reqcontent           AS "Filter JQL"
  FROM cwd_user cwu
 INNER JOIN app_user au ON (cwu.lower_user_name = au.lower_user_name)
  JOIN searchrequest sr ON ( (sr.username = cwu.lower_user_name OR sr.username = au.user_key) OR (sr.authorname = cwu.lower_user_name OR sr.authorname = au.user_key) )
 WHERE cwu.active = 0 ;
Oracle
SELECT DISTINCT sr.filtername  AS "Filter name"
     , sr.username             AS "Filter username"
     , sr.authorname           AS "Filter author"
     , cwu.lower_email_address AS "Filter inactive user email address"
     , cwu.display_name        AS "Filter inactive user display name"
     , au.user_key             AS "Filter inactive user user key"
     , CASE WHEN cwu.active = 0 THEN 'Inactive' ELSE 'Active' END AS "User status"
     , CAST(sr.reqcontent AS VARCHAR2(3000)) AS "Filter JQL"
  FROM cwd_user cwu
 INNER JOIN app_user au ON (cwu.lower_user_name = au.lower_user_name)
  JOIN searchrequest sr ON ( (sr.username = cwu.lower_user_name OR sr.username = au.user_key) OR (sr.authorname = cwu.lower_user_name OR sr.authorname = au.user_key) )
 WHERE cwu.active = 0 ;
MS SQL
SELECT DISTINCT sr.filtername  AS "Filter name"
     , sr.username             AS "Filter username"
     , sr.authorname           AS "Filter author"
     , cwu.lower_email_address AS "Filter inactive user email address"
     , cwu.display_name        AS "Filter inactive user display name"
     , au.user_key             AS "Filter inactive user user key"
     , CASE WHEN cwu.active = 0 THEN 'Inactive' ELSE 'Active' END AS "User status"
     , CAST(sr.reqcontent AS nvarchar(max)) AS "Filter JQL"
  FROM cwd_user cwu
 INNER JOIN app_user au ON (cwu.lower_user_name = au.lower_user_name)
  JOIN searchrequest sr ON ( (sr.username = cwu.lower_user_name OR sr.username = au.user_key) OR (sr.authorname = cwu.lower_user_name OR sr.authorname = au.user_key) )
 WHERE cwu.active = 0 ;
修正 1 - Jira UI (ボード/フィルター設定) でフィルター (上記の SELECT SQL 文の出力に記載されたもの) を開いて所有者を変更
修正 2 - データベースから直接フィルターを更新して所有者をアクティブ ユーザーに変更

問題のあるフィルターのフィルター所有者として、非アクティブなユーザーの代わりにアクティブな Jira ユーザーを選択するようにしてください。

ユーザーの user_key は、app_user テーブルから取得する必要があります。

SELECT user_key FROM app_user WHERE lower_user_name = '<user name of the new owner of the filters>'

この user_key を使って、上記の UPDATE 文に入れてください。

MySQL ERROR 1175 が返される場合は次の記事をご確認ください。MySQL error code: 1175 during UPDATE in MySQL Workbench

PostgreSQL、Oracle、MSSQL
UPDATE searchrequest
   SET username = '<user_key that will be the new owner of these filters>'
     , authorname = '<user_key that will be the new owner of these filters>'
 WHERE id IN ( SELECT sr.id
                 FROM cwd_user cwu
                INNER JOIN app_user au ON (cwu.lower_user_name = au.lower_user_name)
                 JOIN searchrequest sr ON ( (sr.username = cwu.lower_user_name OR sr.username = au.user_key) OR (sr.authorname = cwu.lower_user_name OR sr.authorname = au.user_key) )
                WHERE cwu.active = 0 );
MySQL
SET SQL_SAFE_UPDATES = 0;

UPDATE searchrequest      
   SET username = '<user_key that will be the new owner of these filters>'
     , authorname = '<user_key that will be the new owner of these filters>'
 WHERE id IN ( SELECT id
                 FROM ( SELECT sr.id
                          FROM cwd_user cwu
                         INNER JOIN app_user au ON (cwu.lower_user_name = au.lower_user_name)
                          JOIN searchrequest sr ON ( (sr.username = cwu.lower_user_name OR sr.username = au.user_key) OR (sr.authorname = cwu.lower_user_name OR sr.authorname = au.user_key) )
                         WHERE cwu.active = 0 ) AS t );

SET SQL_SAFE_UPDATES = 1;

削除済みのユーザーが所有するボード

検出
PostgreSQL
SELECT rv."NAME"         AS "Board Name"
     , u.lower_user_name AS "Deleted Username"
 FROM "AO_60DB71_RAPIDVIEW" rv
 JOIN app_user u        ON (rv."OWNER_USER_NAME" = u.user_key)
 LEFT JOIN cwd_user cwu ON (u.lower_user_name = cwu.lower_user_name)
WHERE NOT EXISTS ( SELECT *
                     FROM cwd_user
                    WHERE lower_user_name = u.lower_user_name );
Oracle、MySQL、MSSQL
SELECT rv.NAME           AS "Board Name"
     , u.lower_user_name AS "Deleted Username"
 FROM AO_60DB71_RAPIDVIEW rv
 JOIN app_user u        ON (rv.OWNER_USER_NAME = u.user_key)
 LEFT JOIN cwd_user cwu ON (u.lower_user_name = cwu.lower_user_name)
WHERE NOT EXISTS ( SELECT *
                     FROM cwd_user
                    WHERE lower_user_name = u.lower_user_name );
修正 1 - Jira UI (ボード設定) でボード (上記の SELECT SQL 文の出力に記載されたもの) を開いて所有者を変更
修正 2 - データベースから直接ボードを更新して所有者をアクティブ ユーザーに変更

問題のあるボードのボード所有者として、非アクティブなユーザーの代わりにアクティブな Jira ユーザーを選択するようにしてください。

PostgreSQL
UPDATE "AO_60DB71_RAPIDVIEW"
   SET "OWNER_USER_NAME" = '<user name that will be the new owner of these boards>'
 WHERE "ID" IN ( SELECT rv."ID"
                   FROM "AO_60DB71_RAPIDVIEW" rv
                   JOIN app_user u        ON (rv."OWNER_USER_NAME" = u.user_key)
                   LEFT JOIN cwd_user cwu ON (u.lower_user_name = cwu.lower_user_name)
                  WHERE NOT EXISTS ( SELECT *
                                       FROM cwd_user
                                      WHERE lower_user_name = u.lower_user_name ));
Oracle、MSSQL
UPDATE AO_60DB71_RAPIDVIEW
   SET OWNER_USER_NAME = '<user name that will be the new owner of these boards>'
 WHERE ID IN ( SELECT rv.ID
                 FROM AO_60DB71_RAPIDVIEW rv
                 JOIN app_user u        ON (rv.OWNER_USER_NAME = u.user_key)
                 LEFT JOIN cwd_user cwu ON (u.lower_user_name = cwu.lower_user_name)
                WHERE NOT EXISTS ( SELECT *
                                     FROM cwd_user
                                    WHERE lower_user_name = u.lower_user_name ));
MySQL
UPDATE AO_60DB71_RAPIDVIEW rv
  JOIN app_user u        ON (rv.OWNER_USER_NAME = u.user_key)
  LEFT JOIN cwd_user cwu ON (u.lower_user_name = cwu.lower_user_name)
   SET OWNER_USER_NAME = '<user name that will be the new owner of these boards>'
 WHERE NOT EXISTS ( SELECT *
                      FROM cwd_user
                     WHERE lower_user_name = u.lower_user_name );

削除済みのユーザーが所有するフィルター

検出
PostgreSQL、Oracle、MySQL、MSSQL
SELECT sr.filtername     AS "Filter name"
     , u.lower_user_name AS "Username"
  FROM searchrequest sr
  JOIN app_user u        ON (sr.authorname = u.lower_user_name)
  LEFT JOIN cwd_user cwu ON (u.lower_user_name = cwu.lower_user_name)
 WHERE NOT EXISTS ( SELECT *
                      FROM cwd_user
                     WHERE lower_user_name = u.lower_user_name );
修正 1 - Jira UI (ボード/フィルター設定) でフィルター (上記の SELECT SQL 文の出力に記載されたもの) を開いて所有者を変更
修正 2 - データベースから直接フィルターを更新して所有者をアクティブ ユーザーに変更

問題のあるフィルターのフィルター所有者として、非アクティブなユーザーの代わりにアクティブな Jira ユーザーを選択するようにしてください。

ユーザーの user_key は、app_user テーブルから取得する必要があります。

SELECT user_key FROM app_user WHERE lower_user_name = '<user name of the new owner of the filters>'

この user_key を使って、上記の UPDATE 文に入れてください。

MySQL ERROR 1175 が返される場合は次の記事をご確認ください。MySQL error code: 1175 during UPDATE in MySQL Workbench

PostgreSQL、Oracle、MSSQL
UPDATE searchrequest
   SET username = '<user_key that will be the new owner of these filters>'
     , authorname = '<user_key that will be the new owner of these filters>'
 WHERE id IN ( SELECT sr.id
                 FROM searchrequest sr
                 JOIN app_user u        ON (sr.authorname = u.lower_user_name)
                 LEFT JOIN cwd_user cwu ON (u.lower_user_name = cwu.lower_user_name)
                WHERE NOT EXISTS ( SELECT *
                                     FROM cwd_user
                                    WHERE lower_user_name = u.lower_user_name ));
MySQL
UPDATE searchrequest sr
  JOIN app_user u        ON (sr.authorname = u.lower_user_name)
  LEFT JOIN cwd_user cwu ON (u.lower_user_name = cwu.lower_user_name)
   SET username = '<user_key that will be the new owner of these filters>'
     , authorname = '<user_key that will be the new owner of these filters>'
 WHERE NOT EXISTS ( SELECT *
                      FROM cwd_user
                     WHERE lower_user_name = u.lower_user_name );

ボードがプロジェクト横断か単一プロジェクト (非公開ボードではないもの) かを確認する

プロジェクト横断 / 単一プロジェクト ボード
PostgreSQL
SELECT rv."ID"   AS board_id
     , rv."NAME" AS board_name
     , CASE WHEN COUNT(*) > 1 THEN 'Multi-project Board' ELSE 'Single-project Board' END AS board_type
     , COUNT(*)  AS project_count_on_filter
  FROM "AO_60DB71_RAPIDVIEW" rv 
 INNER JOIN searchrequest sr    ON (sr.id = rv."SAVED_FILTER_ID") 
 INNER JOIN sharepermissions sp ON (sp.entityid = sr.id) 
 INNER JOIN project p           ON (p.id = sp.param1::int) 
 WHERE sp.sharetype = 'project' 
 GROUP BY rv."ID", rv."NAME" 
 ORDER BY COUNT(*) DESC;
MySQL
SELECT rv.ID     AS board_id
     , rv.NAME   AS board_name
     , CASE WHEN COUNT(*) > 1 THEN 'Multi-project Board' ELSE 'Single-project Board' END AS board_type
     , COUNT(*)  AS project_count_on_filter
  FROM AO_60DB71_RAPIDVIEW rv 
 INNER JOIN searchrequest sr    ON (sr.id = rv.SAVED_FILTER_ID)
 INNER JOIN sharepermissions sp ON (sp.entityid = sr.id) 
 INNER JOIN project p           ON (p.id = CAST(sp.param1 AS UNSIGNED)) 
 WHERE sp.sharetype = 'project' 
 GROUP BY rv.ID, rv.NAME
 ORDER BY COUNT(*) DESC;
MSSQL Server
SELECT rv.ID     AS board_id
     , rv.NAME   AS board_name
     , CASE WHEN COUNT(*) > 1 THEN 'Multi-project Board' ELSE 'Single-project Board' END AS board_type
     , COUNT(*)  AS project_count_on_filter
  FROM AO_60DB71_RAPIDVIEW rv 
 INNER JOIN searchrequest sr    ON (sr.id = rv.SAVED_FILTER_ID)
 INNER JOIN sharepermissions sp ON (sp.entityid = sr.id) 
 INNER JOIN project p           ON (p.id = CAST(sp.param1 AS NUMERIC)) 
 WHERE sp.sharetype = 'project' 
 GROUP BY rv.ID, rv.NAME
 ORDER BY COUNT(*) DESC;
Oracle
SELECT rv.ID     AS board_id
     , rv.NAME   AS board_name
     , CASE WHEN COUNT(*) > 1 THEN 'Multi-project Board' ELSE 'Single-project Board' END AS board_type
     , COUNT(*)  AS project_count_on_filter
  FROM AO_60DB71_RAPIDVIEW rv 
 INNER JOIN searchrequest sr    ON (sr.id = rv.SAVED_FILTER_ID)
 INNER JOIN sharepermissions sp ON (sp.entityid = sr.id) 
 INNER JOIN project p           ON (p.id = CAST(sp.param1 AS NUMBER)) 
 WHERE sp.sharetype = 'project' 
 GROUP BY rv.ID, rv.NAME
 ORDER BY COUNT(*) DESC;


既知の問題

MIG-169 - Getting issue details... STATUS

MIG-269 - Getting issue details... STATUS

MIG-1089 - Getting issue details... STATUS

Last modified on Mar 13, 2023

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

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