チーム連携や自動リリースプロセスにおいて、SQL 標準の不統一や監査されていない変更操作は、データエラー、パフォーマンスボトルネック、あるいは本番環境での障害を引き起こす可能性があります。polar_sql_inception プラグインは、監査と実行を統合した自動 SQL 監査エンジンを提供することで、この課題に対応します。開発・テスト・リリース各フェーズで SQL を自動チェックし、コーディング標準を強制するとともに、高リスク操作をブロックすることで、データベース変更の品質とセキュリティを確保できます。
クイックスタート
このセクションでは、簡単な例を使用して polar_sql_inception のコア機能である、3 分未満で準拠していない `CREATE TABLE` 文をブロックする方法を説明します。
データベース内で次のコマンドを実行して、
polar_sql_inceptionプラグインをインストールします。CREATE EXTENSION polar_sql_inception;すべての新規テーブルに主キーを必須とする監査ルールを設定します。
SETコマンドを実行して、現在のセッションでこのルールを有効化します。SET polar_sql_inception.table_rule_check_primary_key = ON;主キーを含まない CREATE TABLE ステートメントを監査するため、監査関数を呼び出します。
executeパラメーターをFALSEに設定して、実行せずに監査のみを実行します。SELECT * FROM polar_sql_inception( sql_statements := 'CREATE TABLE users (id INT, name TEXT);', execute := FALSE );期待される結果:監査が失敗し、明確なエラーメッセージが返されます。
error_levelフィールドの値はerrorであり、error_messageフィールドには違反内容が明示的に記載されています:set a primary key。これにより、プラグインが非準拠 SQL を正常にブロックしたことが確認できます。sql_id | sql_statement | stage | error_level | error_message | affected_rows --------+----------------------------------------+---------+-------------+-------------------+--------------- 1 | CREATE TABLE users (id INT, name TEXT) | checked | warning | set a primary key+| 0 | | | | |
仕組み
構成モード
ご要件に最も適した構成方法を選択してください。
現在のデータベースに対してパラメーターを構成するには、
SETコマンドを使用します。この方法は柔軟性と利便性に優れ、クラスターの再起動を必要とせず、アプリケーションスコープ内でのみ有効です。セッションレベルの構成:
-- 現在のセッションでのみ有効 SET polar_sql_inception.dml_rule_check_dml_where = ON;ユーザーレベル:
-- 現在のユーザーでのみ有効 ALTER username SET polar_sql_inception.dml_rule_check_dml_where = ON;データベース単位の構成:
-- 現在のデータベースでのみ有効 ALTER databasename SET polar_sql_inception.dml_rule_check_dml_where = ON;
実行モデル
polar_sql_inception 関数を呼び出し、複数の SQL ステートメントを渡すと、以下の処理フローに従って実行されます。
逐次処理:プラグインは、SQL ステートメントを順番に 1 つずつ処理します。処理フローは以下のとおりです:ステートメント A の監査 → (監査通過かつ
executeがTRUEの場合)ステートメント A の実行 → ステートメント B の監査 → (監査通過かつexecuteがTRUEの場合)ステートメント B の実行 → …障害による中断:監査または実行中に、
errorレベルの障害が発生した場合、またはwarningレベルの障害が発生し、警告を無視する設定(ignore_warning_when_executing = OFF)になっていない場合、以降のすべてのステートメントの実行フローが中断されます。ただし、プラグインは残りのすべてのステートメントについて監査を継続し、完全な監査結果を返します。
SQL 監査および変更の実行
本セクションでは、polar_sql_inception 関数を使用して SQL ステートメントを監査し、必要に応じて変更を実行する方法について説明します。
関数定義
polar_sql_inception(
sql_statements TEXT,
execute BOOLEAN DEFAULT FALSE,
schema TEXT DEFAULT NULL
)パラメーターの説明
パラメーター | 説明 | 適用範囲 |
| 監査対象の 1 つ以上の SQL ステートメント。 | 機能の適用範囲と同一。 |
| 監査成功後に SQL ステートメントを実行します。デフォルト値は |
|
| SQL ステートメントの実行時に依存するデフォルトスキーマを指定します。 説明 このパラメーターは、監査実行中に内部的に一時的に |
操作例
シナリオ 1:複数の SQL ステートメントを監査のみ実行
主キー必須ルールに準拠しているかどうかを、2 つの CREATE TABLE ステートメントに対して確認します(テーブルは実際に作成しません)。
-- 「テーブルには主キーが必要」というルールを有効化
SET polar_sql_inception.table_rule_check_primary_key = ON;
-- 関数を呼び出して監査を実行
SELECT * FROM polar_sql_inception(
sql_statements := $$
-- エラー例:主キーなし
CREATE TABLE t1 (id INT);
-- 正常例:主キーあり
CREATE TABLE t2 (id INT PRIMARY KEY);
$$,
execute := FALSE
);返された結果:最初の SQL ステートメントはルール違反のためエラーを報告します。2 番目の SQL ステートメントは監査を通過します。
sql_id | sql_statement | stage | error_level | error_message | affected_rows
--------+----------------------------------------------+---------+-------------+---------------------+---------------
1 | +| checked | warning | set a primary key +| 0
| -- エラー例:主キーなし +| | | |
| CREATE TABLE t1 (id INT) | | | |
2 | +| checked | success | no violations found | 0
| +| | | |
| -- 正常例:主キーあり | | | |
| CREATE TABLE t2 (id INT PRIMARY KEY) | | | | シナリオ 2:監査通過後に実行
DML ステートメントに WHERE 句が必要というルールに準拠しているかどうかを、UPDATE ステートメントで検証します。準拠している場合は、実行します。
-- テストデータを準備
CREATE TABLE products (id INT, stock INT);
INSERT INTO products VALUES (1, 100);
-- 「DML には WHERE 句が必要」というルールを有効化
SET polar_sql_inception.dml_rule_check_dml_where = ON;
-- 関数を呼び出して監査および実行を実行
SELECT * FROM polar_sql_inception(
sql_statements := 'UPDATE products SET stock = 99 WHERE id = 1;',
execute := TRUE
);返された結果:SQL ステートメントは監査を通過し、正常に実行されました(stage: executed、error_level: success)。affected_rows フィールドには、1 行が更新されたことが示されています。
sql_id | sql_statement | stage | error_level | error_message | affected_rows
--------+---------------------------------------------+----------+-------------+---------------------+---------------
1 | UPDATE products SET stock = 99 WHERE id = 1 | executed | success | no violations found | 1結果セットの詳細
polar_sql_inception 関数は結果セットを返します。各行は、ユーザーが指定した SQL ステートメント 1 件に対する監査および実行結果に対応します。
フィールド | 説明 |
| SQL ステートメントの序数(1 から開始)。 |
| 処理中の SQL ステートメントの原文。 |
| SQL ステートメントの現在の処理ステージ:
|
| 結果の重大度レベル:
|
| 詳細な監査フィードバックまたはエラーメッセージ。複数の違反がある場合は、改行で区切られます。監査が通過した場合は、 |
| 影響を受ける行数。
|
構成テンプレート
ルールパラメーターを一括で構成できるよう、PolarDB では以下の構成テンプレートを提供しています。ご自身のビジネス要件に合致するルールを選択・適用してください。
-- 実行時構成
SET polar_sql_inception.get_real_affected_rows = OFF;
SET polar_sql_inception.enable_utility_parse_analysis = ON;
SET polar_sql_inception.ignore_warning_when_executing = OFF;
-- テーブル関連ルール
SET polar_sql_inception.table_rule_enable_partition = ON;
SET polar_sql_inception.table_rule_check_primary_key = OFF;
SET polar_sql_inception.table_rule_enable_foreign_key = ON;
SET polar_sql_inception.table_rule_merge_alter_table = OFF;
SET polar_sql_inception.table_rule_must_have_columns = 'column1,column2,column3';
-- カラム関連ルール
SET polar_sql_inception.column_rule_max_char_length = 0;
SET polar_sql_inception.column_rule_enable_text_type = ON;
SET polar_sql_inception.column_rule_enable_json_type = ON;
SET polar_sql_inception.column_rule_check_not_null = OFF;
SET polar_sql_inception.column_rule_enable_timestamp_type = ON;
SET polar_sql_inception.column_rule_check_timestamp_default = OFF;
SET polar_sql_inception.column_rule_check_timestamp_count = OFF;
SET polar_sql_inception.column_rule_check_default_value = OFF;
-- インデックス関連ルール
SET polar_sql_inception.index_rule_enable_null_index_name = ON;
SET polar_sql_inception.index_rule_max_key_parts = 0;
SET polar_sql_inception.index_rule_max_primary_key_parts = 0;
SET polar_sql_inception.index_rule_check_pk_columns_only_int = OFF;
SET polar_sql_inception.index_rule_max_keys = 0;
-- 命名関連ルール
SET polar_sql_inception.naming_rule_check_char = OFF;
SET polar_sql_inception.naming_rule_check_keyword = OFF;
-- DML 関連ルール
SET polar_sql_inception.dml_rule_check_insert_field = OFF;
SET polar_sql_inception.dml_rule_check_dml_where = OFF;
SET polar_sql_inception.dml_rule_enable_select_star = ON;
SET polar_sql_inception.dml_rule_enable_orderby_rand = ON;
SET polar_sql_inception.dml_rule_max_update_rows = 0;
SET polar_sql_inception.dml_rule_max_insert_rows = 0;
SET polar_sql_inception.dml_rule_max_delete_rows = 0;
-- その他ルール
SET polar_sql_inception.check_schema_consistency = OFF;構成リファレンス
実行時構成
パラメーター | デフォルト値 | 説明 |
|
|
|
|
|
|
|
|
説明 |
ルール構成
テーブル関連ルール
ルール名 | パラメーター | デフォルト値 | トリガー条件 |
テーブルには主キーが必要 |
|
|
|
パーティションテーブルは許可されない |
|
|
|
外部キーは許可されない |
|
|
|
テーブルには指定されたカラムが必須 |
|
|
|
複数の ALTER TABLE ステートメントをマージ |
|
|
|
テーブルが存在しない | デフォルトルール | - |
|
主キーは 1 つだけ許可 | デフォルトルール | - |
|
LIKE で参照されるテーブルが存在しない | デフォルトルール | - |
|
ユーザーに権限が必要 | デフォルトルール | - |
|
カラム関連ルール
ルール名 | パラメーター | デフォルト値 | トリガー条件 |
CHAR 型の長さ制限 |
|
|
|
TEXT 型は許可されない |
|
|
|
JSON 型は許可されない |
|
|
|
カラムには NOT NULL 制約が必要 |
|
|
|
TIMESTAMP 型は許可されない |
|
|
|
TIMESTAMP カラムにはデフォルト値が必要 |
|
|
|
|
|
|
|
すべてのカラムにはデフォルト値を定義する必要があります( |
|
|
|
重複するカラム名は許可されない | デフォルトルール | - |
|
インデックス関連ルール
ルール名 | パラメーター | デフォルト値 | トリガー条件 |
インデックスには名前が必要 |
|
|
|
通常のインデックスにおける最大カラム数 |
|
|
|
主キーインデックスにおける最大カラム数 |
|
|
|
主キーカラムは整数型である必要があります |
|
|
|
単一テーブルあたりの最大インデックス数 |
|
|
|
インデックス作成時に指定されたカラムは存在する必要があります | デフォルトルール | - |
|
既に存在するカラムに対してのみインデックスを作成できます | デフォルトルール | - |
|
インデックス名は重複してはいけません | デフォルトルール | - |
|
ユーザーに権限が必要 | デフォルトルール | - |
|
命名ルール
ルール名 | パラメーター | デフォルト値 | トリガー条件 |
名前の文字セットをチェック |
|
|
|
キーワードをチェック |
|
|
|
DML ルール
ルール名 | パラメーター | デフォルト値 | トリガーシナリオ |
INSERT リストを指定する必要があります |
|
|
|
DML ステートメントには WHERE 句が必要 |
|
|
|
|
|
|
|
|
|
|
|
更新行数を制限 |
|
|
|
挿入行数を制限 |
|
|
|
削除行数を制限 |
|
|
|
テーブルおよびカラムは存在する必要があります | デフォルトルール | - | DML ステートメントで存在しないテーブルまたはカラムが参照された。 |
ユーザーに権限が必要 | デフォルトルール | - | DML ステートメントでテーブルに対する権限がない。 |
その他のルール
ルール名 | パラメーター | デフォルト値 | トリガー条件 |
スキーマの一貫性をチェック |
|
| DML または DDL ステートメントで明示的に指定されたスキーマが、polar_sql_inception 関数 の schema パラメーターで指定されたスキーマと異なる場合にトリガーされます。 説明 |