DBMS_UDRシステムパッケージは、リライトバインディング機能を提供し、SQLの実行開始前にマッチングルールに基づいてデータベースが受信したSQL文を書き換えることができます。現在、SELECT、INSERT、REPLACE、UPDATE、DELETE、MERGE、SETの各ステートメントタイプのリライトをサポートしています。リライトバインディングルールは、ビューDBA_OB_USER_DEFINED_RULESでクエリできます。
テナントレベルの構成パラメータenable_user_defined_rewrite_rulesは、リライトバインディング機能を有効にするかどうかを制御し、デフォルトでは無効です。リライトバインディング機能が有効な場合、ユーザー定義のリライトルールに基づいて、サーバーが受信する各SQL文が書き換えられるかどうかをチェックします。
ALTER SYSTEM SET enable_user_defined_rewrite_rules = 'True';
ALTER SYSTEM SET enable_user_defined_rewrite_rules = 'False';
リライトバインディングルールとマッチングの仕組み
リライトバインディングルールとマッチングの仕組みは以下の通りです:
- プリペアドステートメントと同じ構文を使用してリライトルールを定義します。
- リライトルールのテンプレート内で「?」または「:{name}」を使用して、マッチング定数パラメータのマーカーとします。
- 定数パラメータのマーカーは、SQLキーワード、識別子、関数などには使用できません。
- 「?」または「:{name}」でマークされたパラメータ以外の定数値については、厳密一致でマッチングします。
- 複数のマッチング可能なルールが存在する場合、最初にマッチしたルールがランダムに適用されます。
- ルール作成時に指定されたデータベース名(Oracleモードでは現在のUser)と厳密に一致させます。
以下の例では、リライトルールのテンプレート内で「:{name}」を使用して、マッチング定数パラメータのマーカーとしています。
CALL DBMS_UDR.CREATE_RULE('rule1',
'test',
'select :A + 1 from dual',
'select :A + 10, 20 from dual');
以下の例では、リライトルールのテンプレート内で「?」を使用して、マッチング定数パラメータのマーカーとしています。
CALL DBMS_UDR.CREATE_RULE('rule1',
'test',
'select ? + 1 from dual',
'select ? + 10, 20 from dual');
次の表は、SELECTステートメントの例と上記のリライトルールとのマッチング状況を示しています。
SQL |
ルールにヒットするかどうか |
|---|---|
| select 1 + 1 from dual | はい |
| select ? + 1 from dual | はい |
| select 1 + 2 from dual | いいえ |
| select 1 + ? from dual | いいえ |
権限の説明
テナントレベルの構成パラメータenable_user_defined_rewrite_rulesで、そのテナントのリライトバインディング機能の有効化を制御します。ルール作成時に指定するデータベースが権限を管理します。
DBMS_UDRサブプログラムの概要
次の表は、OceanBaseデータベースの現在のバージョンでサポートされているDBMS_UDRサブプログラムとその概要を示しています。
サブプログラム |
説明 |
|---|---|
| CREATE_RULE | カスタムリライトルールを作成します。 |
| DISABLE_RULE | カスタムリライトルールを無効にします。 |
| ENABLE_RULE | カスタムリライトルールを有効にします。 |
| REMOVE_RULE | カスタムリライトルールを削除します。 |