Trazer apenas dado(s) alterado(s)

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).

BancoDadosAlterados

Ninguém tem ideia de como isso deve ser feito pra me dar uma luz?

http://www.postgresqltutorial.com/creating-first-trigger-postgresql/

1 curtida

Mano, já zerei o stackoverflow de tanto que eu procurei hahahahaha

Infelizmente tudo que tem de exemplo/conteúdo tem o mesmo problema, saem todos os dados em um mesmo campo.

O que eu fiz pra resolver foi simplesmente criar uma coluna na tabela dos logs pra cada coluna da tabela que eu quero ver, aí funciona tranquilo.

Essas functions não funcionaram?

1 curtida

Todas funcionam, mas nao do jeito que eu quero sacou? A que eu fiz ficou parecido com a desse segundo link que tu postou, nao é como eu queria mas resolve o problema.

Entendi, esses negocios de banco de dados é bem chatinho mesmo, é cada gambiarra que a gente faz pra funcionar como queremos kkkkkk

1 curtida

hahahahaha pois é, nem fale rsrs