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 NEWdall'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 hstorevalori digitati dal nome della colonna. Il che fa schifo, perché poi sono tutti lanciati texte 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.