Contexto
Estou usando o PostgreSQL 10.12.
Eu quero ser capaz de disparar uma função de gatilho em algumas tabelas específicas com dados geográficos.
Esta função de gatilho é projetada para criar um ponto PotGIS em uma coluna geom
de lat
e lon
valores.
Eu quero aplicar essa mesma função de gatilho em várias tabelas cada vez que uma nova linha é inserida.
A nomenclatura das colunas que contêm valores de latitude e longitude não é consistente nas tabelas, mas segue um padrão...
O que tenho 100% de certeza é que:
1. sempre há duas colunas contendo valores de latitude e longitude,
2. o nome dessas colunas nem sempre é o mesmo nas diferentes tabelas (caso contrário, seria muito simples), mas o palavra 'latitude' e a palavra 'longitude'
sempre aparecem em seu nome e nunca aparecem em outros nomes de coluna.
Por exemplo, na tabela A:
_loc_longitude_
e_loc_latitude_
e na tabela B:
_building_longitude_center
e_building_latitude_center
por exemplo (+ muitos outros).
A função de disparo é a seguinte:
CREATE OR REPLACE FUNCTION make_point_with_latlon()
RETURNS trigger AS
$$
DECLARE
varlon := NULL;
varlat := NULL;
BEGIN
IF to_jsonb(NEW) SIMILAR TO '.*longitude.*' THEN
varlon := NEW.the_column_whith_longitude_in_its_name;
END IF;
IF to_jsonb(NEW) SIMILAR TO '.*latitude.*' THEN
varlat := NEW.the_column_whith_latitude_in_its_name;
END IF;
NEW.geom = ST_MakePoint(varlon, varlat);
END
$$
LANGUAGE 'plpgsql';
Com os seguintes acionadores:
CREATE TRIGGER make_point_with_latlon_but
BEFORE INSERT OR UPDATE ON schema.table1
FOR EACH ROW
EXECUTE PROCEDURE schema.make_point_with_latlon();
CREATE TRIGGER make_point_with_latlon_but
BEFORE INSERT OR UPDATE ON schema.table2
FOR EACH ROW
EXECUTE PROCEDURE schema.make_point_with_latlon();
CREATE TRIGGER make_point_with_latlon_but
BEFORE INSERT OR UPDATE ON schema.table3
FOR EACH ROW
EXECUTE PROCEDURE schema.make_point_with_latlon();
-- (...and many more other tables that need the same trigger).
Não sei como procurar o padrão .*latitude.*
nos nomes das colunas passados para a função e como obter seu valor em duas variáveis que posso usar para construir o ponto.
E minhas habilidades de pesquisa no Google para pesquisar esse tipo de coisa estão longe de ser perfeitas, portanto, retornando resultados barulhentos.
Pergunta
Existe alguma possibilidade de fazer isso?
Você pode usar visualizações INFORMATION_SCHEMA e variáveis especiais: TG_TABLE_SCHEMA, TG_TABLE_NAME
Citado de documentos:
Dado o próximo exemplo:
db<>fique aqui
É apenas um exemplo de como usar INFORMATION_SCHEMA e variáveis especiais dentro de uma trigger, mas talvez um pro-user do Postgres possa lhe dar uma solução melhor.