web-dev-qa-db-ja.com

トリガーで値がnullでないhstoreをフィルターする方法は?

質問を説明する最も簡単な方法は、 監査トリガー を使用することです。

ただし、挿入時には、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以降用です。

hstorejsonではなく、jsonbを使用した解決策を探しています。 jsonまたはjsonbを使用した代替方法を含めることもできますが、hstoreが推奨されます。

1
thames

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)
      )
   );
_

少し速いかもしれませんが、よくわかりません。おそらくそれほど大きな違いはありません。

また、jsonbjsonb_strip_nulls()を介したルート(コメントで説明されている)が比較してどのように機能するかはわかりません。パフォーマンス比較で報告できますか?

1

あなたはこれを試すことができます:

  • 最初に、新しい変数の型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関数内のさまざまな場所。

0
binhgreat