1

Temat: anulowanie wpisu - wyzwalacz

mam wyzwalacz w którym sprawdzam czy dany rekord może zostać wpisany

...
IF (s > 1) THEN
   RETURN NEW;
ELSE
   RETURN NULL;
END IF;
...

ale wpisuje mi do tabeli niezależnie od tego jaki jest wynik sprawdzenia IF-em
czy anulowanie wpisu do tabeli w wyzwalaczu jest może realizowane innym sposobem np EXIT zamiast RETURN NULL???

2

Odp: anulowanie wpisu - wyzwalacz

Musisz pokazać definicję wyzwalacza.

3

Odp: anulowanie wpisu - wyzwalacz

definicja wyzwalacza

DROP TRIGGER IF EXISTS tri_ai_xxx ON pojazdy._xxx ;
CREATE TRIGGER tri_ai_xxx
AFTER
INSERT
ON pojazdy._xxx 
FOR EACH ROW
EXECUTE PROCEDURE pojazdy.f_tri_ai_xxx();

4

Odp: anulowanie wpisu - wyzwalacz

No i jeszcze procedurę bo nie wiem co to za zmienna 's'

5

Odp: anulowanie wpisu - wyzwalacz

s to tylko przykład w rzeczywistości wygląda to tak:

CREATE OR REPLACE FUNCTION pojazdy.f_tri_ai_xxx() RETURNS trigger AS
$$
DECLARE
idpk_poj INTEGER;
idpk_info_diag SMALLINT;
int_nr_diag INTEGER;
czas TIMESTAMP;
BEGIN
idpk_info_diag := NEW.idfk_nr_diag;    
idpk_poj := (trim(leading '_' from TG_TABLE_NAME)::varchar)::integer; 
int_nr_diag :=pojazdy.f_sint_nr_info_diag_int(idpk_info_diag);

IF (int_nr_diag >=16 AND int_nr_diag <=25) THEN 
   EXECUTE 'INSERT INTO pojazdy.t_dg (dt,idfk_poj,idfk_diag)
            VALUES ('''||NEW.dt_data_czas||''', '||idpk_poj||', '||idpk_info_diag||')';
   RETURN NEW;
ELSE
  IF (pojazdy.f_int_int_if_start_bool(idpk_poj,idpk_info_diag)= TRUE) THEN 
     IF(pojazdy.f_int_int_t_actual_bool(idpk_poj, idpk_info_diag) = FALSE) THEN 
      
          EXECUTE 'INSERT INTO pojazdy.t_actual (dt_dg,idfk_poj,idfk_diag)
               VALUES ('''||NEW.dt_data_czas||''', '||idpk_poj||', '||idpk_info_diag||')';

               EXECUTE 'INSERT INTO pojazdy.t_dg (dt,idfk_poj,idfk_diag)
                         VALUES ('''||NEW.dt_data_czas||''', '||idpk_poj||', '||idpk_info_diag||')';
        RETURN NEW;
     ELSE 
       RETURN NULL;
     END IF;
  ELSE
       IF(pojazdy.f_int_int_if_start_exists_bool(idpk_poj,idpk_info_diag)=TRUE)THEN
      czas := pojazdy.f_int_int_start_dt(idpk_poj,idpk_info_diag); 

              EXECUTE 'INSERT INTO pojazdy.t_history (dt_start,dt_stop,idfk_poj,idfk_diag)
               VALUES ('''||czas||''','''||NEW.dt_data_czas||''', '||idpk_poj||', '||idpk_info_diag||')';
  
              EXECUTE 'DELETE  FROM pojazdy.t_actual
               WHERE idfk_poj = '||idpk_poj||' AND idfk_diag = '||pojazdy.f_int_idpk_info_diag_sint(idpk_poj,int_nr_diag-100)||'';
              
               EXECUTE 'INSERT INTO pojazdy.t_dg (dt,idfk_poj,idfk_diag)
                         VALUES ('''||NEW.dt_data_czas||''', '||idpk_poj||', '||idpk_info_diag||')';
          RETURN NEW;
       ELSE
            RETURN NULL;
       END IF;
  END IF;
END IF;
END;
$$
LANGUAGE PLPGSQL;

6

Odp: anulowanie wpisu - wyzwalacz

To może zmień tego triggera na before insert co?