Olá Pessoal,

Veremos nesta QUICK TIPS como gravar a datahora de criação e da última atualização de um registro no FireBird via trigger. Isso é útil quando queremos sabar quando um determinadao registro vou criado e/ou atualizado pela última vez. Imagine que você tenha uma tabela de cliente na sua base. Adicione nela mais 2 campos DataHoraInclui e DataHoraAltera os dois do tipo TimeStamp.

O tipo de Dado TIMESTAMP, no DIALECT 3, armazena a Data e a hora ao mesmo tempo, e seu tamanho é de 32 bits inteiros longos.  Uma dúvida muito comum e se este tipo armazena milisegundos. Pois bem, ele até armazena mas algumas partes do Firebird não suportam milisegundos como  o CURRENT_TIMESTAMP, CURRENT_TIME, CAST() e isc_decode(encode)_timestamp.

Você pode armazenar e recuperar informações de milisegundos através da API, mas a maioria dos componentes de acesso nativos excluem essas informações porque estão utilizando a estrutura 'struc tm' para fazer as conversões. Você pode utilizar uma UDF para obter a hora precisa do servidor, como por exemplo a função GetExactTimestamp() da fbudf.so/fbudf.dll (Fonte firebase.com.br)

Feito isso vamos criar as triggers:

CREATE TRIGGER TG_ATUALIZADATAHORAINCLUI FOR CLIENTE
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
new.datahorainclui = CURRENT_TIMESTAMP;
END;


CREATE TRIGGER TG_ATUALIZADATAHORAALTERA FOR CLIENTE
ACTIVE BEFORE UPDATE
POSITION 0
AS
BEGIN
new.datahoraaltera = CURRENT_TIMESTAMP;
END;

O Tipo TimeStamp, no Dialect 1, não existia, neste caso você terá que usar o tipo Date que armazena Data e
Hora.
Você também poderia  pegar o usuario logado para saber quem inseriu ou alterou. E mais se vc usar o IBExpert poderia gerar toda uma infra de log de alterações mas isso é assunto para vídeo aula.

Abraços e até a próxima QUICK TIPS.