Sto scrivendo un trigger di convalida. Il trigger deve confermare che la somma di un array è uguale a un altro campo. Dal momento che ho molti esempi di questa convalida, voglio scrivere una singola procedura e creare più trigger, ognuno con un diverso set di campi da controllare.
Ad esempio, ho il seguente schema:
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
);
La convalida deve confermare ciò impressions_count = sum(impressions_graph)
.
Sono bloccato perché non so come accedere in modo dinamico a un campo NEW
dall'interno di 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');
Ho provato a eseguire comandi dinamici facendo EXECUTE 'SELECT $1 FROM NEW' INTO total USING TG_ARGV[0]
, ma PL / PGsql si lamenta che NEW è una relazione sconosciuta.
Mi rivolgo specificamente a PostgreSQL 9.1.
NEW
è quello di utilizzare hstore(NEW)
e quindi accedere ai campi come hstore
valori digitati dal nome della colonna. Il che fa schifo, perché poi sono tutti lanciati text
e se vuoi lavorare con loro nel loro tipo originale devi ricacciarli. In alternativa, è possibile scrivere un trigger in un altro linguaggio procedurale come PL / Python che ha un supporto migliore per l'accesso dinamico ai record.