検証トリガーを書いています。トリガーは、配列の合計が別のフィールドと等しいことを検証する必要があります。この検証には多くのインスタンスがあるため、単一のプロシージャを記述して、チェックするフィールドのセットがそれぞれ異なる複数のトリガーを作成します。
たとえば、次のスキーマがあります。
CREATE TABLE daily_reports(
start_on date
, show_id uuid
, primary key(start_on, show_id)
-- _graph are hourly values, while _count is total for the report
, impressions_count bigint not null
, impressions_graph bigint[] not null
-- interactions_count, interactions_graph
-- twitter_interactions_count, twitter_interactions_graph
);
検証では、それを確認する必要がありますimpressions_count = sum(impressions_graph)
。
NEW
plpgsql内からフィールドに動的にアクセスする方法がわからないので、行き詰まっています。
CREATE FUNCTION validate_sum_of_array_equals_other() RETURNS TRIGGER AS $$
DECLARE
total bigint;
array_sum bigint;
BEGIN
-- TG_NARGS = 2
-- TG_ARGV[0] = 'impressions_count'
-- TG_ARGV[1] = 'impressions_graph'
-- How to access impressions_count and impressions_graph from NEW?
RETURN NEW;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER validate_daily_reports_impressions
ON daily_reports BEFORE INSERT OR UPDATE
FOR EACH ROW EXECUTE
validate_sum_of_array_equals_other('impressions_count', 'impressions_graph');
私が試した動的コマンドを実行することによってEXECUTE 'SELECT $1 FROM NEW' INTO total USING TG_ARGV[0]
、しかしPL / pgSQLがNEWが不明関係であることを不平を言います。
特にPostgreSQL 9.1をターゲットにしています。
NEW
は、列名をキーとする値hstore(NEW)
としてフィールドを使用してアクセスすることhstore
です。それらはすべてキャストさtext
れ、元のタイプで操作したい場合はキャストバックする必要があるので、これは残念です。または、動的レコードアクセスをより適切にサポートするPL / Pythonなどの別の手続き型言語でトリガーを作成することもできます。