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';
リライトバインディングルールとマッチング原理
リライトバインディングルールとマッチング原理は以下の通りです:
- リライトルールは、Prepared Statementsと同じ構文を使用して定義します。
- リライトルールテンプレート内で、「?」または「:{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 | カスタムルールを削除します。 |