[firebase-br] Trigger para definir o valor de uma coluna para 0 (zero) ao atualizar o registro

Fernando Pereira fernandotoosp em gmail.com
Seg Fev 20 10:55:06 -03 2017


Bom dia, amigos.
Desculpe recorrer à lista para uma necessidade aparentemente simples, mas
pesquisei por muito tempo e fiz várias tentativas, e não ainda consegui.
Preciso saber quais os registros que ainda não "subiram" para a nuvem, e
também os que foram editados após o upload. Assim, fiz uma TRIGGER para
setar o campo para 0, sempre que o registro for alterado.

Estou usando o Firebird 3.0.1
Abaixo, os scripts que escrevi. O que será que está errado? Agradeço
qualquer dica/sugestão.


-- Criação da tabela
CREATE TABLE CAMPANHA (
  ID_CAMPANHA INTEGER NOT NULL,
  DS_CAMPANHA VARCHAR(150) CHARACTER SET WIN1252 COLLATE WIN_PTBR,
  CD_TIPO_CAMPANHA SMALLINT DEFAULT 1,
  DT_CAMPANHA_INICIO DATE,
  DT_CAMPANHA_FINAL DATE,
  ST_UPDATE_WEB SMALLINT DEFAULT 0,
  CONSTRAINT PK_CAMP PRIMARY KEY (ID_CAMPANHA)
);

---- Definindo generator e triggers
CREATE GENERATOR GEN_CAMPANHA_ID;
SET GENERATOR GEN_CAMPANHA_ID TO 0;
set TERM !! ;
CREATE TRIGGER CAMPANHA_BI FOR CAMPANHA ACTIVE BEFORE INSERT POSITION 0 AS
BEGIN IF (NEW.ID_CAMPANHA IS NULL) THEN NEW.ID_CAMPANHA =
GEN_ID(GEN_CAMPANHA_ID, 1); END !!
CREATE TRIGGER CAMPANHA_BU FOR CAMPANHA ACTIVE BEFORE UPDATE POSITION 0 AS
BEGIN IF (NEW.ST_UPDATE_WEB IS NULL) THEN NEW.ST_UPDATE_WEB = 0; END !!
set TERM ; !!

----Inserindo um registro teste
INSERT INTO CAMPANHA (DS_CAMPANHA, CD_TIPO_CAMPANHA, DT_CAMPANHA_INICIO,
DT_CAMPANHA_FINAL) VALUES ('TESTE CAMPANHA 1', 1, '2017-01-01',
'2017-01-15');

----Simulando o envio do registro para o servidor na nuvem, onde quero que
o campo ST_UPDATE_WEB seja setado para '1'
UPDATE CAMPANHA SET ST_UPDATE_WEB = 1 WHERE ID_CAMPANHA = 1;

---- Ao fazer qualquer UPDATE no registro, quero que o campo ST_UPDATE_WEB
seja setado novamente para '0' (o que não acontece)
UPDATE CAMPANHA SET DT_CAMPANHA_FINAL = '2017-01-20' WHERE ID_CAMPANHA = 1;



Mais detalhes sobre a lista de discussão lista