No Postgres, estava criando uma funcao para os logs. Até aí sem muitos problemas, criei a funcao e a tabela com as colunas que vao armazenar os dados alterados/inseridos/apagados. Meu problema é que em uma das tabelas, por exemplo, tenho 14 colunas. Só que na tabela dos logs, em vez de trazer APENAS o(s) dado(s) que sofreu(sofreram) alteracao(alteracoes), traz tudo.
Para os inserts, ok. Mas, por exemplo, se apenas 1 dado de 1 coluna foi alterado, é complicado ver todos os dados das 14 colunas ali. Vira um jogo dos 7 erros pra saber o que foi alterado/apagado hahaha
A tabela dos logs tem essas colunas: schema, nome da tabela, nome do usuário que fez a alteracao, data/hora da alteracao, tipo de alteracao (insert, update ou delete), dado anterior, novo dado e a query.
A funcao tá assim (se sou novato em programacao, em banco muito mais. Peguei como base vários exemplos da internet e montei o código, me perdoem por qualquer erro idiota que possa ter):
DECLARE
v_old_data TEXT;
v_new_data TEXT;
BEGIN
IF(TG_OP = 'UPDATE') THEN
v_old_data := ROW(OLD.*);
v_new_data := ROW(NEW.*);
INSERT INTO dadosalterados.logged_actions (schema_name, table_name, user_name, action, original_data, new_data, query)
VALUES (TG_TABLE_SCHEMA::TEXT, TG_TABLE_NAME::TEXT, session_user::TEXT, substring(TG_OP, 1, 1), v_old_data, v_new_data, current_query());
RETURN NEW;
Pra delete e insert o código segue o mesmo padrao.
Qual seria a maneira de trazer só, apenas, exclusivamente o que foi alterado/apagado? Abaixo a imagem de como sai. Como podem ver é uma bagunca que só, trazendo dados das 14 colunas, e nao apenas da(s) que foi(foram) alterada(s).