Próbuję utworzyć wyzwalacz dla 2 różnych funkcji, z różnicą tylko pod warunkiem:

CREATE OR REPLACE FUNCTION seculoxxi()
    RETURNS integer AS $total1$
    declare
        total1 integer;
    BEGIN
       SELECT count(*) into total1 
       FROM edicao
       WHERE ano >= 2000;
       RETURN total1;
    END;
    $total1$ LANGUAGE plpgsql;

I

CREATE OR REPLACE FUNCTION seculoxx()
RETURNS integer AS $total2$
declare
    total2 integer;
BEGIN
   SELECT count(*) into total2 
   FROM edicao
   WHERE ano < 2000;
   RETURN total2;
END;
$total2$ LANGUAGE plpgsql;

Struktura tabeli jest również prosta, istnieją trzy rzędy:

  1. Kod (numeryczny)
  2. Wersja (znak)
  3. Rok (Integer)

Jak mogę stworzyć ten wyzwalacz?

1
G Stick 26 listopad 2018, 13:47

1 odpowiedź

Najlepsza odpowiedź

To totalny strzał w ciemności, ale zakładając, że pole, które chcesz zmodyfikować, nazywa się „licznikami”, myślę, że spust może wyglądać tak:

CREATE OR REPLACE FUNCTION edicao_insert_trigger()
  RETURNS trigger AS
$BODY$
DECLARE
  total integer;
BEGIN
  select count (*)
  into total
  from edicao e
  where
    (NEW.ano >= 2000 and e.ano >= 2000) or
    (NEW.ano < 2000 and e.ano < 2000);

  NEW.counter := total;

  RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Następnie, aby dodać wyzwalacz do swojej tabeli:

CREATE TRIGGER insert_edicao_trigger
  BEFORE INSERT
  ON edicao
  FOR EACH ROW
  EXECUTE PROCEDURE edicao_insert_trigger()

Teraz, kiedy robisz wstawkę, powinna automatycznie dodać wartość pola „licznik”.

Dla przypomnienia, jeśli próbujesz uzyskać unikalny identyfikator, znacznie lepiej byłoby użyć sekwencji.

create sequence edicao_gt_2000;
create sequence edicao_lt_2000;

CREATE OR REPLACE FUNCTION edicao_insert_trigger()
  RETURNS trigger AS
$BODY$
BEGIN
  NEW.counter :=
    case
      when NEW.ano >= 2000 then nextval ('edicao_gt_2000')
      else nextval ('edicao_lt_2000')
    end;
  RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
0
Hambone 26 listopad 2018, 18:26