[firebase-br] Metadata de Triggers

João Dias de Carvalho Neto jdias.bjsoftware em gmail.com
Seg Dez 1 17:39:19 -03 2008


Obrigado Sandro, foi muito útil sua ajuda. Vou implementar o código agora
mesmo!

2008/12/1 Sandro Souza <escovadordebits em gmail.com>

> Bom dia/tarde João.
>
> Você pode ver as respostas à sua pergunta na seguinte página:
>
> http://firebird-with-delphi.blogspot.com/2007/10/firebird-system-table-part-vi.html
>
> Mas resumindo, aqui está a associação tradicional de valores:
>
> 1 - Before Insert
> 2 - After Insert
> 3 - Before Update
> 4 - After Update
> 5 - Before Delete
> 6 - After Delete
>
> A partir do Firebird 1.5, essa associação foi alterada pera permitir
> combinações mais complexas de eventos, ficando dessa forma:
>
> Bits do campo RDB$TRIGGER_TYPE:
>
> Bit 0 = 0 para BEFORE ou 1 para AFTER
>
> Primeira associação de evento:
> Bits 1 e 2 = 01 para INSERT, 10 para UPDATE ou 11 para DELETE.
>
> Segunda associação de evento:
> Bits 3 e 4 = 01 para INSERT, 10 para UPDATE ou 11 para DELETE.
>
> Terceira associação de evento:
> Bits 5 e 6 = 01 para INSERT, 10 para UPDATE ou 11 para DELETE.
>
> Após efetuar essa combinação, subtraia 1 para obter o valor que será
> armazenado no campo/coluna RDB$TRIGGER_TYPE.
>
> Dessa forma nova, você pode associar desde uma única operação (INSERT,
> UPDATE ou DELETE) a todas as operações juntas em qualquer um dos momentos
> (BEFORE ou AFTER).
>
> Por exemplo:
>
> AFTER DELETE (1 operação (DELETE) no momento AFTER (depois)):
>
> +---+---+---+---+---+---+---+---+
> | 7 | 6 - 5 | 4 - 3 | 2 - 1 | 0 |
> +---+---+---+---+---+---+---+---+
> | 0 | 0 - 0 | 0 - 0 | 1 - 1 | 1 | --> nada,nada,DELETE,AFTER =
> 00000111(binário) - 1 = 7 - 1 = 6
> +---+---+---+---+---+---+---+---+
>
> -------------------
>
> BEFORE INSERT UPDATE (2 operações (INSERT e UPDATE) no momento BEFORE
> (antes)):
>
> +---+---+---+---+---+---+---+---+
> | 7 | 6 - 5 | 4 - 3 | 2 - 1 | 0 |
> +---+---+---+---+---+---+---+---+
> | 0 | 0 - 0 | 1 - 0 | 0 - 1 | 0 | --> UPDATE,INSERT,BEFORE =
> 00010010(binário) - 1 = 18 - 1 = 17
> +---+---+---+---+---+---+---+---+
>
> -------------------
>
> AFTER INSERT UPDATE DELETE (todas as 3 operações no momento AFTER
> (depois)):
>
> +---+---+---+---+---+---+---+---+
> | 7 | 6 - 5 | 4 - 3 | 2 - 1 | 0 |
> +---+---+---+---+---+---+---+---+
> | 0 | 0 - 1 | 1 - 1 | 1 - 0 | 1 | --> INSERT,DELETE,UPDATE,AFTER =
> 00111101(binário) - 1 = 61 - 1 = 60
> +---+---+---+---+---+---+---+---+
>
> Dessa forma, você pode seguir o caminho inverso para decodificar esse
> valor.
>
> Por exemplo, se você estiver utilizando o Borland Delphi, Free Pascal,
> Lazarus e outros compatíveis, poderia decodificar da seguinte forma:
>
> function DecodeFirebirdTriggerType(TriggerType: Byte): String;
> const
>  Moments: packed array [0..1] of String = ('BEFORE', 'AFTER');
>  Operations: packed array [0..3] of String = ('', ' INSERT', ' UPDATE','
> DELETE');
> begin
>  Result := Moments   [ TriggerType and 1       ] +
>            Operations[(TriggerType shr 1) and 3] +
>            Operations[(TriggerType shr 3) and 3] +
>            Operations[(TriggerType shr 5) and 3];
> end;
>
> Espero ter ajudado mais que atrapalhado. :D
>
>
> 2008/12/1 João Dias de Carvalho Neto <jdias.bjsoftware em gmail.com>
>
> > Boa tarde,
> >
> > Tentei retornar a metadata dos gatilhos da minha database e percebi que
> as
> > actions "AFTER", "BEFORE",
> > Insert, Update e Delete, modificam o campo  RDB$TRIGGERS.RDB$TRIGGER_TYPE
> >
> > Por se tratar de um inteiro, não consegui saber todas as possibilidades,
> >
> > Alguém sabe o que significa as variações de
> RDB$TRIGGERS.RDB$TRIGGER_TYPE?
> >
> >
> > Obrigado
> >
> > --
> > João Dias de Carvalho Neto
> > jdias.bjsoftware em gmail.com
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> >
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



-- 
João Dias de Carvalho Neto
jdias.bjsoftware em gmail.com



Mais detalhes sobre a lista de discussão lista