[firebase-br] Metadata de Triggers

Sandro Souza escovadordebits em gmail.com
Seg Dez 1 16:29:27 -03 2008


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
>



Mais detalhes sobre a lista de discussão lista