Ich schreibe einen Validierungsauslöser. Der Trigger muss überprüfen, ob die Summe eines Arrays einem anderen Feld entspricht. Da ich viele Instanzen dieser Validierung habe, möchte ich eine einzelne Prozedur schreiben und mehrere Trigger mit jeweils unterschiedlichen Feldern erstellen, die überprüft werden sollen.
Zum Beispiel habe ich das folgende 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
);
Die Validierung muss dies bestätigen impressions_count = sum(impressions_graph)
.
Ich stecke fest, weil ich nicht weiß, wie ich NEW
von plpgsql aus dynamisch auf ein Feld zugreifen kann:
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');
Ich habe versucht , dynamisches Kommando ausführen , indem Sie EXECUTE 'SELECT $1 FROM NEW' INTO total USING TG_ARGV[0]
, aber PL / pgSQL beklagt , dass NEU eine unbekannte Beziehung ist.
Ich ziele speziell auf PostgreSQL 9.1 ab.
NEW
zu verwenden hstore(NEW)
und dann darauf zuzugreifen hstore
. Was scheiße ist, denn dann sind sie alle besetzt text
und wenn Sie mit ihnen in ihrem ursprünglichen Typ arbeiten möchten, müssen Sie sie zurückwerfen. Alternativ können Sie einen Trigger in einer anderen prozeduralen Sprache wie PL / Python schreiben, die den dynamischen Datensatzzugriff besser unterstützt.