アプリケーションが誤ったSQLステートメントを送信し、ステートメントをすぐに変更できないシナリオでは、誤ったSQLステートメントを正しいステートメントにマップするようにSQLステートメントマッピング機能を構成できます。 SQL文マッピング機能を設定した後、アプリケーションから送信されたSQL文が正しくない場合でも、SQL文を正しいSQL文にマッピングできます。
注意事項
SQL文マッピング機能を設定すると、指定された文字列に一致するすべてのSQL文が指定されたSQL文にマップされます。
前提条件
データベース用にpolar_sql_mappingプラグインが作成されていることを確認します。 デフォルトでは、このプラグインは新しく作成されたデータベースに対して自動的に作成されます。 以前のデータベースでは、プラグインを手動で作成する必要があります。
プラグインを手動で作成するには、次のコマンドを実行します。
set default_with_rowids to off;
create extension polar_sql_mapping;
Usage
polar_sql_mapping.use_sql_mapping
パラメーターを設定して、SQL文のマッピング機能を有効にします。 デフォルトでは、このパラメーターはoffに設定されています。alter system set polar_sql_mapping.use_sql_mapping=on;
誤ったsql文の自動記録を有効にするには、
polar_sql_mapping.record_error_SQL
パラメーターを設定します。 デフォルトでは、このパラメーターはoffに設定されています。alter system set polar_sql_mapping.record_error_sql=on;
説明パフォーマンスへの影響を最小限に抑えるため、SQL文マッピング機能を使用する必要がなくなった場合は、誤ったSQL文の記録を無効にすることをお勧めします。
alter system set polar_sql_mapping.record_error_sql=off;
正しくないSQL文を照会します。
select * from emp;
同様の出力が表示されます:
ERROR: relation "emp" does not exist
誤ったSQL文がpolar_sql_mapping.error_sql_infoに記録された後、次のコマンドを実行して、polar_sql_mapping.error_sql_info:
select * from polar_sql_mapping.error_sql_info ;
の詳細を照会します。同様の出力が表示されます:
id | query | emessage | calls ----+--------------------+-------------------------------+------- 1 | select * from emp; | relation "emp" does not exist | 1
error_sql_infoでIDが1のSQL文を指定されたSQL文にマップするマッピングを確立します。
select polar_sql_mapping.insert_mapping_id(1, 'select 1');
正しくないSQL文を再度照会します。
select * from emp;
同様の出力が表示されます:
?column? ---------- 1 (1 row)
説明ほとんどのアプリケーションはPreparedStmtを使用します。 新しいSQLステートメントを作成するときは、'?' の代わりにプレースホルダ $nを使用します。 例:
select * from polar_sql_mapping.polar_sql_mapping_table ;
同様の出力が表示されます:
id | source_sql | target_sql ----+----------------------------------+--------------------------------- 4 | select 1 from dual where a = $1; | select 1 from dual where 1 = $1 (1 row)
パラメーター
パラメーター | 説明 |
polar_sql_mapping.max_num | 記録できる個別のSQL文の最大数を制御するために使用されます。 デフォルト値は 10 です。 指定された数を超える明確なSQL文は無視されます。 指定した値を変更するには、データベースを再起動します。 |
polar_sql_mapping.error_sql_info_clear() | 記録された不正なSQL文をクリアするために使用します。 |
正常に実行されるSQL文を置き換える
SQL文マッピング機能を使用して正常に実行されるSQL文を置き換えるには、次の操作を実行します。
polar_sql_mapping.use_sql_mapping
パラメーターを設定します。 SQL文マッピング機能を有効にします。 デフォルト値: off。alter system set polar_sql_mapping.use_sql_mapping=on;
polar_sql_mapping.record_error_sql
パラメーターを設定します。 不正なSQL文の自動記録を有効にします。 デフォルト値: off。alter system set polar_sql_mapping.record_error_sql=on;
説明パフォーマンスへの影響を最小限に抑えるため、SQL文マッピング機能を使用する必要がなくなった場合は、誤ったSQL文の記録を無効にすることをお勧めします。
alter system set polar_sql_mapping.record_error_sql=off;
一致ノードを設定します。 一致モードに一致するすべてのSQL文は、polar_sql_mapping.error_sql_infoに格納されます。
次の例は、test_tableを含むSQL文が記録されていることを示しています (一致ロジックは、SQL構文のLIKE演算子の一致ロジックと一致しています) 。
一致モードを設定します。
polar_sql_mapping.error_patternを '% test_table %';
一致モードを有効にします。
set polar_sql_mapping.record_error_sql to true;
記録するSQL文を作成します。
select * from test_table; select a from test_table; select max(a) from test_table;
polar_sql_mapping.error_sql_infoに記録および保存された結果を表示します。
select * from polar_sql_mapping.error_sql_info;
同様の出力が表示されます:
id | query | emessage | calls ----+--------------------------------+----------------------------+------- 1 | select * from test_table; | Error Pattern Force Record | 1 2 | select a from test_table; | Error Pattern Force Record | 1 3 | select max(a) from test_table; | Error Pattern Force Record | 1 (3 rows)
test_tableを含むすべてのSQL文は、polar_sql_mapping.error_sql_infoに記録および保存されます。
記録されたSQL文を指定されたSQL文に置き換えます。
select polar_sql_mapping.insert_mapping_id(x, 'text');
説明上記の文で、xは正しい文のIDを示し、textは記録されたSQL文を置き換えるSQL文のテキストを示します。 実際の条件に基づいてSQL文を置き換えます。
パフォーマンスの低下を防ぐには、SQL文マッピング機能を使用する必要がなくなったときに構成を復元します。
reset polar_sql_mapping.error_pattern;