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 | カスタムリライトルールを削除します。 |