You can bind a trigger function to as many tables as you want; just execute a CREATE TRIGGER
statement for each binding. Make sure to schema-qualify the table name in your statement (BEFORE INSERT OR UPDATE ON a.point
etc.) If you have a large number of schemas, you could generate the SQL dynamically by iterating over the rows in information_schema.schemata
.
If the trigger function needs to do something different depending on which table it's running on, you can access the table schema and name through TG_TABLE_SCHEMA
and TG_TABLE_NAME
. (See the docs for all available variables).
If you have a large number of schemasIn your case, you could generate the SQL dynamically by iterating over the rows in information_schema.schemata
.a dynamic trigger function might be something like this:
CREATE OR REPLACE FUNCTION sample_attribute_from_polygon()
RETURNS trigger AS $body$
BEGIN
EXECUTE 'SELECT attribute FROM ' || TG_TABLE_SCHEMA || '.polygon WHERE ST_Within($1, polygon.geom) LIMIT 1'
USING NEW.geom
INTO NEW.attribute_sample;
RETURN NEW;
END;
$body$ LANGUAGE plpgsql;