Problema com trigger de LOG

Firebird

12/07/2006

Estou montando algumas triggers para fazer LOG de um sistema, ou seja, montar os scripts SQL que disparam as triggers. Eu monto o SQL concatenando a parte ´fixa´ (nomes de campos) com a parte variável (valores dos campos), ex:
vSQL = ´UPDATE tabela SET Campo1 = ´||NEW.Campo1||´, Campo2 = ´||NEW.Campo2||´, Campo3 = ´||NEW.Campo3||´ WHERE Campo1 = OLD.Campo1


O primeiro problema surgiu com os campos não requeridos, se tiverem o valor nulo, toda a expressão ficará nula. Eu resolvi isso com um COALESCE. (O NULL está entre apóstrofos, mas ao gerar a SQL, eles são removidos, o que é o correto)
vSQL = ´UPDATE tabela SET Campo1 = ´||NEW.Campo1||´, Campo2 = ´||NEW.Campo2||´, Campo3 = ´||COALESCE(NEW.Campo3, ´NULL´, NEW.Campo3)||´ WHERE Campo1 = OLD.Campo1


O segundo problema são os campos do tipo string (VARCHAR/CHAR) que devem aparecer na SQL final com apóstrofos. No caso dos campos requeridos foi fácil resolver o problema, assim:
vSQL = ´UPDATE tabela SET Campo1 = ´||NEW.Campo1||´, Campo2 = ´´´||NEW.Campo2||´´´, Campo3 = ´||COALESCE(NEW.Campo3, ´NULL´, NEW.Campo3)||´ WHERE Campo1 = OLD.Campo1


O problema é quando tenho que combinar isso com os campos não requeridos ou seja, os que usam o COALESCE, tentei de várias maneiras concatenar os apóstrofos com o terceiro parâmetro da função, mas em todos os casos os apóstrofos são removidos. A única maneira que funcionou foi colocando-os fora da função, mas daí conflita com o NULL, se mantenho os apóstrofos do NULL, remove os da string, se os tiro, dá certo a string, mas se o campo for nulo toda a SQL ficará nula.

Alguém sabe como posso resolver isso? Ou existe uma maneira mais simples de fazer esse log? Eu preciso resolver isso logo.

Obrigada


Gandalf.nho

Gandalf.nho

Curtidas 0

Respostas

Gandalf.nho

Gandalf.nho

12/07/2006

Ninguém sabe?


GOSTEI 0
Gandalf.nho

Gandalf.nho

12/07/2006

Consegui resolver. Pelo jeito, o COALESCE não gosta de concatenações, tive que o substituir por CASE e passar o apóstrofo na concatenação usando uma UDF que emula a função CHR do Delphi (concatenando direto no CASE tb não dava certo).


GOSTEI 0
POSTAR