Blue Prismにはアーカイブ機能があり、セッションログを退避させてDB容量を節約することができます。(セッションログはSQL ServerのDBに保持されている)
ただ、この機能でアーカイブできるのはあくまでセッションログのみです。
皆さんが日々作成しているプロセスやオブジェクトの変更履歴などはアーカイブ対象外です。
そこで、今回は変更履歴をアーカイブするプロセスを作ってみようと思います。
やりたいこと
- プロセス、オブジェクトの変更履歴をアーカイブする
⇒ DBのBPAAuditEventsテーブルから対象データを抽出する - 新規作成(インポート含む)はアーカイブ対象外
- 〇ヶ月前~△ヶ月前の履歴を対象とできるように、プロセスのインプットを設定
- 出力ファイル名はoutProcObj_yyyyMMdd-yyyyMMdd(※).csvとする。
⇒ yyyyMMddの部分は、対象期間のうち、履歴データの最古の日付と最新の日付が入るものとする。
出力先のフォルダパスは、プロセスのインプットで設定できるものとする。 - 各プロセス、オブジェクトの変更履歴のうち、最新〇件は残す
といった設定ができるようにする。
これができないと、例えば、変更したのが1ヶ月以上前のプロセスに対して、1ヶ月前の変更履歴もアーカイブ対象にした場合に、最新の変更履歴がなくなってしまう。(プロセス新規作成時の履歴しか残らない) - 履歴データ削除時はトランザクションを張り、削除失敗時はロールバックする仕組みを入れる
- アーカイブするトリガーを設定できるようにする。
今回は、対象となる変更履歴の件数が〇件以上ならアーカイブするものとする。 - バックグラウンド実行可能とする。
⇒ 今回使用するオブジェクトがすべてバックグラウンド実行がデフォルトとなっていたため、問題なし。 - セッション停止のリクエストがない限り、実行し続けるものとする。
⇒ スケジュールを圧迫しないようにするため - アーカイブされたデータを復元したい場合は、出力されたCSVファイルをA5M2(SQL開発ツール)で手動インポートする
プロセス説明
出来上がったものがこちら。
動かす前の準備
入力パラメータ
実行前に以下の入力パラメータを設定します。
項目名 | 説明 |
対象月From | (例)5 ⇒ 今日から5ヶ月前の履歴データから対象とする |
対象月To | (例)1 ⇒ 今日から1ヶ月前の履歴データまでを対象とする |
残す履歴件数 | 各プロセス、オブジェクトで直近何件まで履歴データを残すか設定する |
アーカイブ出力先フォルダパス | アーカイブファイルの出力先フォルダパス (例)C:\Users\XXXX\XXXX\log |
DB接続情報名 | DBD接続情報が登録されている認証情報の名前 |
件数閾値 | アーカイブ処理を実行するトリガーとなる件数の閾値 (例)10 ⇒ 対象月From~Toの期間で履歴データ件数が10件をオーバーしたらアーカイブする |
チェック周期(秒) | 本プロセスの実行周期(秒) ここで設定した秒数ごとに対象履歴データの件数が閾値を超えているかチェックを行う |
認証情報
DBの接続情報を認証情報に設定します。
DBのユーザー名、パスワードの他に、サーバー名、データベース名を定義します。
サーバー名ってどこ見たらいいの?という方は以下記事を参考にしてください。
アーカイブ出力先フォルダ
アーカイブファイルの出力先フォルダを作ります。
作ったフォルダのパスは、前述したプロセスの入力パラメータ「アーカイブ出力先フォルダパス」に設定します。
履歴データの取得
対象の履歴データをどうやって取得しているのかについて触れておきます。
DBからデータを取得しているので、SQLをちょっと工夫して書くことで目的のデータを取得しています。
以下は、履歴データ作成日時において{対象月From}~{対象月To} の範囲で、直近{残す履歴件数}件以外のデータを取得するクエリーです。
select
t1.*
from
BPAAuditEvents t1
where
t1.sCode IN('B004', 'P004')
and t1.eventdatetime between {対象月From} and {対象月To} except
select
eventdatetime,
eventid,
sCode,
sNarrative,
gSrcUserID,
gTgtUserID,
gTgtProcID,
gTgtResourceID,
comments,
EditSummary,
oldXML,
newXML
from
(
select
row_number() over(partition by t1.gTgtProcID order by t1.eventdatetime desc) as rownum,
*
from
BPAAuditEvents t1
left join
BPAProcess t2
on t2.processid = t1.gTgtProcID
where
t1.sCode IN('B004', 'P004')
and eventdatetime between {対象月From} and {対象月To}
) s1
where
s1.rownum <= {残す履歴件数}
ポイントは、BPAAuditEventsテーブルのsCodeの条件指定です。
P004,B004の頭の「P」「B」はProcess,Objectを指します。
その後に続く00Xという番号は、新規登録、更新、削除などの処理の種類を区別する番号です。
004は更新系処理(インポートによる上書きも含む)ですので、今回は004のみ対象とします。
上記クエリーは2つのSelect文をexceptで繋げています。
下部のSelect文で直近〇件の履歴データを取得し、それ以外の履歴データをとるためにexceptで除外しています。
このクエリーを、対象のデータ件数の取得や履歴データ削除のクエリーにも流用しています。
動かしてみる
試しに、本記事執筆時点である2020/06/04から
5ヶ月前~3ヶ月前(2020/01/04~2020/03/04)の履歴データをアーカイブしてみましょう。
対象データは15件でした。(A5M2でSQLを叩いて確認)
では、最初にプロセスの入力データを設定しましょう。
設定が終わったらセッション実行します。
ファイル出力を確認したら、停止要求を出してプロセスを止めます。
CSVファイル名に「20200221-20200225」とあります。
これらの日付の意味は、5ヶ月前~3ヶ月前(2020/01/04~2020/03/04)の履歴データのうち、対象データの最古、最新の日付となっています。
事前に対象データが15件あると示しましたが、確かに最古、最新の日付は上記の通りになっているのが分かるかと思います。
一応、CSVファイルの中身を確認してみましょう。
プロセス、オブジェクトがXML形式で保存されているため、1レコードがどこからどこまでなのか分かりづらいのですが、
左上のeventdatetimeの日時(2020/02/21 7:53:52…)を見る限り、対象の履歴データが正しくアーカイブされていそうですね。
復元したい場合は、A5M2で対象のテーブル(BPAAuditEvents)に対してインポートします。
A5M2の紹介、使い方については後日追記します。
サンプル
https://github.com/falcslab/blueprism
プロセスオブジェクト履歴アーカイブ.bprelease