Preparing boards and filters to be migrated with the Jira Cloud Migration Assistant (JCMA)

お困りですか?

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

コミュニティに質問

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

Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.

*Fisheye および Crucible は除く

 

Jira Cloud Migration Assistant 1.10.0 以降を使用して、プロジェクト間のボードとフィルターをクラウドに移行できるようになりました。

このお知らせの詳細

プロジェクト間のボードとフィルターの移行に関する詳細

目的

This document provides instructions on how to prepare the migration of all filters and boards with the Jira Cloud Migration Assistant, as described in this article.

環境

  • Jira 7.6 以降

サニティー チェック

すべてのボードとフィルターを移行する前に、Jira Server のデータベースでいくつかの健全性チェック (と軽微な修正) を実行する必要があります。

JCMA locates boards with projects if the filter refers to a single project. While migrating cross-project boards and filters, JCMA will set the location of the board to the board owner. If the board owner or filter owner is inactive, on cloud, the board or filter becomes private and can no longer be accessed or modified.

すべてのボードとフィルターを移行する前に、次の事項をチェックしましょう。

  1. ボードは有効なフィルターに関連付けられている必要があります

  2. ボードの列は有効なステータスに関連付けられている必要があります

  3. クイック フィルターの無効な JQL が修正されている必要があります

  4. メール アドレスなどの個人データが、いずれのフィルターからも削除されている必要があります

  5. 共有権限の設定が有効なグループを参照している必要があります

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

  7. The admin users running the migration must have Browse project permissions on all projects that are selected for migration.

  8. Owners of all boards and filters must have Browse project permissions for the projects associated with those boards and filters.

移行前チェック

The changes below will require a DBA or a user who knows how to use SQL queries.

データベース レベルでのデータの変更が含まれるため、変更を行う際には十分にご注意ください。

Always back up your data before making any database modifications. If possible, test any alter, insert, update, or delete SQL commands on a staging server first.

To maximize the chance of success, it is recommended that you perform each of the following checks on your server instance before attempting a board and filter migration.

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

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

In addition, the Jira admin user who runs the migration may not have access to search for and fix those filters and boards through the UI (unless they change the permissions at the DB level and restart Jira).

機能しない (壊れた) ボードを修復するには、次のようないくつかの方法があります。

検出

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;
修復: 壊れたボード用のダミー フィルターを作成する

Jira の UI でフィルターを作成します。次の SQL SELECT を実行してフィルター ID を取得し、それを使って壊れたボードにそれぞれリンクします。

フィルター ID を取得すると、次の UPDATE 文によって、壊れたボードが新しいフィルターに再び関連付けされます。

すべてのデータベース

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 );
修正: REST を使用した無効なフィルターを含むボードを削除する

ボードを削除する安全な方法は、REST API を使用することです。

REST API の使用方法に関するガイダンスは、Jira REST API の例を参照してください。

ボードの削除方法の定義とパラメータについては、「ボードの削除」を参照してください。

  • ボード ID は、影響を受けるボードを特定するためのクエリと同じボード ID です。

curl を使用してボードを削除する REST 呼び出しの例

curl
curl -u username:password -X DELETE -H "Content-Type: application/json" https://jiraserver.com/rest/agile/1.0/board/{board ID}

ボードを閲覧する権限がない場合は、エラーが表示されることがあります。

自分をボードの所有者に変更するには、以下の SQL クエリを実行します。

PostgreSQL の例

UPDATE "AO_60DB71_RAPIDVIEW" 
SET "OWNER_USER_NAME" = '{my username}'
WHERE "ID" = {board ID}; 

ユーザー名がわからない場合は、CWD_USER テーブルを確認してください。

PostgreSQL の例

SELECT user_name 
FROM cwd_user 
WHERE email_address = 'myuser@example.com';

自分を所有者に変更したら、REST 呼び出しをもう一度試すことができます。

修正: フィルターが無効なボードをデータベースから削除する

If the board IDs are present in the "AO_60DB71_BOARDADMINS" table, delete them from there first; otherwise, you'll see foreign key constraint errors when deleting the boards from the "AO_60DB71_RAPIDVIEW" table (see the image below).

壊れたボードを検出する上記のクエリでは、「AO_60DB71_BOARDADMINS」テーブルからデータを取得して、必要に応じてそこから削除する必要のある ID を提供します。

Note: This method is known to encounter various database constraint errors. If that occurs, it's recommended that you try a different method. 

AO_60DB71_BOARDADMINS テーブルからボードを削除するには、次の手順に従います (必要な場合)。

PostgreSQL

DELETE
  FROM "AO_60DB71_BOARDADMINS"
WHERE "RAPID_VIEW_ID" IN (<ID of a Board>, <ID of another Board>, ...);

ORACLE、MYSQL、MSSQL サーバー

DELETE
  FROM AO_60DB71_BOARDADMINS
WHERE RAPID_VIEW_ID IN (<ID of a Board>, <ID of another Board>, ...);

AO_60DB71_RAPIDVIEW テーブルからボードを削除するには、次の手順に従います。

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 );


存在しないステータスにリンクされている列をフィルタリングする (オプション)

JCMA の最新バージョンでは、ステータスが欠落しているフィルターを移行できます。これによって、フィルターに依存しているボードが壊れた状態になる可能性があります。そのような箇所をすべて見つけて修正したい場合は、次の方法を実行します。

検出

存在しないステータス 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 );
UI を使用する
Jira UI でボード (上記の SQL SELECT クエリの出力に記載されたもの) を開いて、ステータスを削除します。
DB クエリ

PostgreSQL

DELETE
  FROM "AO_60DB71_COLUMNSTATUS" col
 WHERE NOT EXISTS ( SELECT * FROM issuestatus WHERE id = col."STATUS_ID" );
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 );
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 );
DELETE col
  FROM AO_60DB71_COLUMN col
 WHERE NOT EXISTS ( SELECT * FROM AO_60DB71_COLUMNSTATUS WHERE COLUMN_ID = col.ID );

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

フィルターに特殊文字が含まれていると、次のエラーによって移行プロセスが失敗する可能性があります。

project-import We couldn't import Board <Board ID> (プロジェクトインポート ボード <ボード ID> をインポートできませんでした)。理由: クイック フィルターの JQL が無効です: 無効な JQL : JQL クエリのエラー: 「@」文字は予約済みの JQL 文字です。文字列内で囲むか、代わりにエスケープ文字「\u0040」を使用する必要があります。(行 1、文字 34)

メール アドレスについては、次のセクションもご参照ください。

検出

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 '%@%';

UI によってフィルターの 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 52)

The '@' is a reserved character, but on the server/DC, as long as you ensure that the Filters containing the '@' symbol have the email addresses enclosed by double quotes, this will allow the migration to occur and the filters to be functional on the Cloud site. There is no need to change it to the account ID, for example.

次の SQL クエリを実行すると、個人データ(メール アドレス)を含むすべてのフィルターを検索して、正しい書式であるかどうかを確認できます。次に例を示します。

project = "ABC" AND reporter = "username@yourcompany.com"
検出
SELECT * FROM searchrequest WHERE reqcontent LIKE '%@%';


共有権限に無効なグループがある (オプション)

フィルターの共有権限の設定でグループが参照されているものの、そのグループ自体がすでに Jira に存在しないというケースがあります。フィルターは移行されますが、そのフィルターが破損するか、アクセスできなくなる可能性があります。壊れたボードを移行するリスクを軽減したい場合は、移行前にご確認ください。ユーザー & グループのスコープで移行する場合は、参照先のグループが現在のプランに含まれていないと、フィルターが破損する可能性があります。

これは、グループへの参照を含むフィルターの JQL には適用されません。
検出
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 )
修復のオプション
  1. Jira Server でグループを再作成します。

  2. 共有権限エントリを削除します。

    1. UI でフィルター/ボード/プロジェクトを編集して、権限設定で無効なグループへの参照を削除します。

  3. 共有権限のグループを置き換えます。

    1. 上記と同じですが、参照を削除する代わりに、有効なグループに置き換えます。

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

移行されたフィルターの所有権が、クラウド上で非アクティブであるユーザーを参照している場合があります。関連するプロジェクト横断ボードの場所は、移行後のプロセスで修正する必要があります。ただし、移行前に所有者を修正するほうが、より実現可能な作業です。 

If a username has multiple entries across directories with at least one entry marked as inactive, SQL queries may incorrectly identify the user as inactive. To ensure accuracy, check the user’s active status by referring to How to list all Users and Groups in Jira.

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

検出
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


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;
Fix - Update those boards, changing their owners to active users, from the database directly

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

MySQL ERROR 1175 が返される場合は、「MySQL Workbench で UPDATE 中に MySQL エラー コード 1175 が発生する」をご確認ください。

PostgresSQL
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 Workbench で UPDATE 中に MySQL エラー コード 1175 が発生する」をご確認ください。

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 );
Fix - Update those boards, changing their owners to active users, from the database directly

問題のあるボードのボード所有者として、非アクティブなユーザーの代わりにアクティブな 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 Workbench で UPDATE 中に MySQL エラー コード 1175 が発生する」をご確認ください。

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 );


マルチプロジェクト ボードの有無を判断する

マルチプロジェクト ボード (と単一プロジェクト ボード) がいくつ存在するのかを確認するには、次の手順に従います。

複数のプロジェクトにわたる JQL を検出する

すべてのデータベース

SELECT * FROM SEARCHREQUEST WHERE REQCONTENT LIKE '%project in%' OR REQCONTENT LIKE '%project%project%'
複数のプロジェクトにわたる権限を検出する

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 サーバー

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;


Once you have cleaned up your boards and filters, you can procceed to migrating your boards and filters.


最終更新日: 2024 年 10 月 30 日

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

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