監査ルール
ヒント
システムは「監査ルール」機能を提供します。ATT_AUDIT_RULE によるプリセットルールをサポートし、strategyKey をルーティング識別子として使用します。
この記事では、ルールメタデータの登録、QualitySqlGenerator の実装、データベース方言(ComponentRegistry / ComponentItem)の統合、rule.getConfig() でのパラメータ拡張について説明し、監査ルールの拡張と適応をすばやく完了できるようにします。
1. 概要
監査ルールは、データ品質をチェックし制約するために使用します。「プリセットルールテーブル + 戦略識別子 + SQL ジェネレータ + データベース方言」という拡張可能なアーキテクチャを採用しています。
コア目標
- ATT_AUDIT_RULE テーブルでルールメタデータを管理します。キー項目
strategyKeyは具体的な実装へのルーティングに使用します。 - QualitySqlGenerator インターフェースで、ルール SQL、エラーデータ SQL、有効データページング SQL を統一生成します。
- ComponentRegistry ファクトリで、データソースタイプに応じた方言実装(
ComponentItem)を選択し、複数データベースへ適応します。 rule.getConfig()でルールパラメータ拡張をサポートし、エンティティ変更を避けます。
全体フロー(概要)
ATT_AUDIT_RULEにルールをプリセットし、一意のstrategyKeyを設定します。@Component("strategyKey")を付けたQualitySqlGenerator実装を登録します。QualitySqlGenerator内でComponentRegistryを呼び出し、対応するComponentItem(方言)を取得します。- 方言内で SQL 断片または完全な SQL を生成し、監査を実行して結果を返します。
2. テーブル構造(ATT_AUDIT_RULE)
テーブル名: ATT_AUDIT_RULE
場所: QDATA_TEST Schema
このテーブルは、プリセット監査ルールの基本情報を設定・管理するために使用します。バックエンドは strategyKey 項目に基づき、対応するルール実装へルーティングします。
| 項目名 | 型 | 説明 |
|---|---|---|
| ID | BIGINT | 主キー、自動採番 |
| NAME | VARCHAR2(128) | ルール名 |
| QUALITY_DIM | CHAR(1) | 品質ディメンション: 1-完全性、2-一意性、3-有効性、4-一貫性、5-適時性 |
| TYPE | CHAR(1) | ルールタイプ |
| LEVEL | CHAR(1) | ルールレベル: 1-フィールドレベル、2-テーブルレベル |
| DESCRIPTION | VARCHAR2(512) | ルール説明 |
| VALID_FLAG | VARCHAR2(1) | 有効かどうか: 0-無効、1-有効 |
| DEL_FLAG | VARCHAR2(1) | 取り除きフラグ: 0-未取り除き、1-取り除き済み |
| CREATE_BY | VARCHAR2(32) | 作成者 |
| CREATOR_ID | BIGINT | 作成者 ID |
| CREATE_TIME | DATETIME | 作成時刻 |
| UPDATE_BY | VARCHAR2(32) | アップデート者 |
| UPDATER_ID | BIGINT | アップデート者 ID |
| UPDATE_TIME | DATETIME | アップデート時刻 |
| REMARK | VARCHAR2(512) | 備考 |
| CODE | VARCHAR2(32) | ルールコード |
| USE_CASE | VARCHAR2(512) | 利用ケース |
| EXAMPLE | VARCHAR2(512) | 例 |
| ICON_PATH | VARCHAR2(256) | アイコンパス |
| STRATEGY_KEY | VARCHAR2(256) | 戦略識別子。例: NOT_NULL_ID_CHECK。バックエンドはこれを使って具体的な監査ルール実装を特定します |
重要ポイント
STRATEGY_KEY: ルールの一意識別子です。コード実装の@Component("xxx")と一致させる必要があります。USE_CASEとEXAMPLE: 開発者またはユーザーが、ルールの適用シナリオと参考例を理解するために使用します。
3. ルール拡張手順
3.1 テーブルに基本ルール情報を設定する
ATT_AUDIT_RULEにレコードを登録します。一意のSTRATEGY_KEY(例:NOT_NULL_ID_CHECK)を 必ず 設定してください。- 必要に応じて、
QUALITY_DIM、TYPE、LEVEL、USE_CASE、EXAMPLEなどの項目を入力します。
3.2 QualitySqlGenerator を実装する
場所: qdata-quality/src/main/java/tech/qiantong/qdata/quality/utils/quality/QualitySqlGenerator.java
インターフェース:
public interface QualitySqlGenerator {
String generateSql(QualityRuleEntity rule);
String generateErrorSql(QualityRuleEntity rule);
String generateValidDataSql(QualityRuleEntity rule, int limit, int offset);
}実装と紐づけ(例):
@Component("NOT_NULL_ID_CHECK") // テーブル内の STRATEGY_KEY と一致させる
public class NotNullIdCheckGenerator implements QualitySqlGenerator {
// 説明用。コアロジックは 3.3 を参照
}3.3 ファクトリでデータベース方言を選択し SQL を生成する
generate* メソッド内で、ComponentRegistry を通じてデータソースタイプに対応する ComponentItem(データベース方言実装)を選択し、具体的な SQL 生成メソッドを呼び出します。
例:
@Override
public String generateSql(QualityRuleEntity rule) {
ComponentRegistry registry = new ComponentRegistry();
ComponentItem item = registry.getComponentItem(rule.getDaDatasourceById().getDatasourceType());
return item.generateCharacterValidationSql(rule); // 例: 文字検証
}
@Override
public String generateErrorSql(QualityRuleEntity rule) {
ComponentRegistry registry = new ComponentRegistry();
ComponentItem item = registry.getComponentItem(rule.getDaDatasourceById().getDatasourceType());
return item.generateCharacterValidationErrorSql(rule);
}
@Override
public String generateValidDataSql(QualityRuleEntity rule, int limit, int offset) {
ComponentRegistry registry = new ComponentRegistry();
ComponentItem item = registry.getComponentItem(rule.getDaDatasourceById().getDatasourceType());
return item.generateCharacterValidationValidDataSql(rule, limit, offset);
}3.4 方言登録とデフォルト実装
場所:qdata-quality/src/main/java/tech/qiantong/qdata/quality/utils/qualityDB/ComponentRegistry.java
public class ComponentRegistry {
private final Map<String, ComponentItem> componentItemMap = new HashMap<>();
private final ComponentItem defaultImpl = new DefaultQuality();
public ComponentRegistry() {
this.componentItemMap.put(DbType.MYSQL.getDb(), new MySqlQuality());
this.componentItemMap.put(DbType.DM8.getDb(), new DM8Quality());
}
public ComponentItem getComponentItem(String dbCode) {
return componentItemMap.getOrDefault(dbCode, defaultImpl);
}
}説明:
内蔵対応データベースタイプ:
MySQL鈫?MySqlQualityDM8鈫?DM8Quality
他のデータベースタイプを拡張する手順:
ComponentItemインターフェースを実装する新しい実装クラスを作成します。ComponentRegistryコンストラクタで登録します。this.componentItemMap.put(DbType.ORACLE.getDb(), new OracleQuality());
具体的なデータベースタイプに一致しない場合、
DefaultQualityデフォルト実装を使用します。
4. SQL 作成標準
4.1 SQL 断片インターフェース
場所:qdata-quality/src/main/java/tech/qiantong/qdata/quality/utils/qualityDB/ComponentItem.java
public interface ComponentItem extends QualityFragSql {
// 共通ページング
default String addPagination(String sql, int limit, int offset) {
return String.format("%s LIMIT %d OFFSET %d", sql, limit, offset);
}
}- ページングなどの共通ロジックは
defaultメソッドにまとめられます。 - データベース固有の SQL は、各実装クラス側で仕上げます。
4.2 データベース固有実装
既存ファクトリでカバーされないデータベースタイプの場合は、独自に実装します。
MySqlQuality を参照してください。
package tech.qiantong.qdata.quality.utils.qualityDB.dialect;
import tech.qiantong.qdata.quality.dal.dataobject.quality.QualityRuleEntity;
import tech.qiantong.qdata.quality.utils.qualityDB.ComponentItem;
public class MySqlQuality implements ComponentItem {
@Override
public String fragCharacter(QualityRuleEntity rule) {
String column = rule.getRuleColumn();
String regex = (String) rule.getConfig().get("regex");
return String.format("BINARY %s REGEXP '%s'", column, regex);
}
}説明:
fragCharacterメソッドは、文字検証ルールの SQL 断片を実装します。- Oracle、PostgreSQL、Kingbase、DM8 などのデータベースは、それぞれ独自の適応ロジックが必要です。
5. 注意事項
パラメータ拡張
- 監査ルールに新しいパラメータが必要な場合、
rule.getConfig()から統一的に保存・取得します。 - 拡張性を高めるため、エンティティ項目を頻繁に変更しないでください。
- 監査ルールに新しいパラメータが必要な場合、
データベースタイプ拡張
- データベースごとの SQL 差異は大きいため、
ComponentItem実装でカスタマイズが必要です。 - データベースタイプ拡張では、データ接続開発ドキュメント のデータベース方言実装標準を参照し、一貫性を保ってください。
- データベースごとの SQL 差異は大きいため、
