質問を説明する最も簡単な方法は、 監査トリガー を使用することです。
ただし、挿入時には、null値を含むすべての値が保存されます。 hstore(NEW.*)
のnull値を除外したい。これを行う最も簡単/最速の方法は何ですか?
ソース: https://github.com/2ndQuadrant/audit-trigger/blob/master/audit.sql#L134
audit_row.row_data = hstore(NEW.*) - excluded_cols;
これは明らかに機能しませんが、うまくいけば、答えがどのようになるかを説明します。
audit_row.row_data = hstore(hstore(NEW.*) FILTER (WHERE value IS NOT NULL)) - excluded_cols;
ユーザーが作成した関数を使用しないことが優先されます。 Postgres関数/演算子のみを使用します。
これはPostgreSQL 11以降用です。
hstore
やjson
ではなく、jsonb
を使用した解決策を探しています。 json
またはjsonb
を使用した代替方法を含めることもできますが、hstore
が推奨されます。
Postgresの組み込みツールとhstore
モジュールのみを使用して、要求に応じてjsonb
を使用せずにそれを行うには、以下を置き換えます。
_audit_row.row_data = hstore(NEW.*) - excluded_cols;
_
と:
_audit_row.row_data = hstore(
ARRAY (
SELECT ARRAY[key, value]
FROM each(hstore(NEW.*) - excluded_cols)
WHERE value IS NOT NULL
)
);
_
とにかくhstore vlaueのネストを解除するときに、代わりにWHERE
句の_excluded_cols
_のキー名を削除できます。
_audit_row.row_data = hstore(
ARRAY (
SELECT ARRAY[key, value]
FROM each(hstore(NEW.*))
WHERE value IS NOT NULL
AND key <> ANY (excluded_cols)
)
);
_
少し速いかもしれませんが、よくわかりません。おそらくそれほど大きな違いはありません。
また、jsonb
とjsonb_strip_nulls()
を介したルート(コメントで説明されている)が比較してどのように機能するかはわかりません。パフォーマンス比較で報告できますか?
あなたはこれを試すことができます:
record
を宣言します。例:empty_row
EXECUTE format('select * from populate_record(null::%s.%s, '''')', TG_TABLE_SCHEMA, TG_TABLE_NAME) INTO empty_row;
audit_row.row_data = hstore(NEW.*) - empty_row - excluded_cols;
その後、再利用できますempty_row
関数内のさまざまな場所。