1

Temat: Problem z domeną

CREATE TABLE "TABLE_PREF"
(
  "POLE1" "T_IDENTIFIER" NOT NULL,
  "POLE2" "T_IDENTIFIER" NOT NULL,
  "POLE3" "T_IDENTIFIER", 
  "POLE4" "T_IDENTIFIER",
  "POLE5" "T_IDENTIFIER",
  "POLE6" "T_IDENTIFIER" NOT NULL,
  "POLE7" "T_PTS",
  "POLE8" "T_BOOL" NOT NULL DEFAULT 'F'::bpchar,
  "POLE9" "T_PTS",
  "POLE10" "T_PTS",
  "POLE11" "T_PTS",
  "POLE12" "T_PTS",
  CONSTRAINT "PK_TABLE_PREF" PRIMARY KEY ("POLE1"),
  CONSTRAINT "FK_TABLE_PREF_APP_1" FOREIGN KEY ("POLE2", "POLE3")
      REFERENCES "TABLE_APP" ("POLE1", "POLE2") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE,
  CONSTRAINT "FK_TABLE_PREF_APP_2" FOREIGN KEY ("POLE4")
      REFERENCES "TABLE_APP" ("POLE3") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE,
  CONSTRAINT "TABLE_PREF_POOL" FOREIGN KEY ("POLE4", "POLE5")
      REFERENCES "ER_STUDIES_POOL" ("POLE2", "POLE3") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION,
  CONSTRAINT "AK2_TABLE_PREF" UNIQUE ("POLE4", "POLE3", "POLE5"),
  CONSTRAINT "AK3_TABLE_PREF" UNIQUE ("POLE3", "POLE5"),
  CONSTRAINT "AK_TABLE_PREF" UNIQUE ("POLE5", "POLE2", "POLE3")
)

2

Odp: Problem z domeną

Nie wiem jak wygladaja triggery i czy poprawnie wypelniaja pozostale pola
ale ten inserktory podalest,  sam bez dodatkowych triggerow sie nie uda bo podczas wstawiania pomijasz pola ktore sa 'not null' (pole3 i pole4).
Chyba musisz pokazac definicje triggera, ktory dziala przed insertem.

3

Odp: Problem z domeną

proszę, oto triggery

CREATE OR REPLACE FUNCTION "TABLE_PREF_BIU0"()
  RETURNS trigger AS
$BODY$
DECLARE
    "VAR_POLE3" INTEGER;
    "VAR_POLE4" INTEGER;
BEGIN
raise notice 'test';
   SELECT "POLE3", "POLE4" INTO "VAR_POLE3","VAR_POLE4" FROM "TABLE_APP" WHERE "POLE2"=NEW."POLE2";
   
   NEW."POLE3"="VAR_POLE3";
   NEW."POLE4"="VAR_POLE4";

    IF(TG_OP = 'INSERT') THEN NEW."POLE8"='F'; 
        END IF;  
   RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

Drugi trigger nie zmienia żadnych pól typu T_IDENTIFIER. Dodam, że ostrzeżenie 'test' się nie wyświetla

pozdrawiam
misiek

4

Odp: Problem z domeną

5

Odp: Problem z domeną

TABLE_APP jest to tabela powiązana poprzez referencje z TABLE_PREF.
wyżej wymienione zapytanie zawsze zwraca poprawny wynik.

Czy to nie dziwne, że mając umieszczoną linię zaraz po begin raise notice, to powinna się ona wykonać za każdym razem kiedy trigger jest wywołyany? Czy nie implikuje to jednocześnie tego, że trigger nie jest wywoływany, skoro to ostrzeżenie się nie pojawia?

6

Odp: Problem z domeną

Pokaz definicje triggera, to co pokazales to definicja funkcji.

7

Odp: Problem z domeną

CREATE TRIGGER "TABLE_PREF_BIU0"
  BEFORE INSERT OR UPDATE
  ON "TABLE_PREF"
  FOR EACH ROW
  EXECUTE PROCEDURE "TABLE_PREF_BIU0"()

8

Odp: Problem z domeną

selecy * from information_schema.triggers where trigger_name="TABLE_PREF_BIU0"

Ostatnio edytowany przez rski (2010-01-18 22:55:17)

9

Odp: Problem z domeną

ponieważ drugie zapytanie jest rozszerzeniem pierwszego, to wklejam tylko wynik tego drugiego

trigger_catalog; trigger_schema; trigger_name; event_manipulation; event_object_catalog; event_object_schema; event_object_table; action_statement; action_orientation; condition_timing

"rek";"public";"TABLE_PREF_BIU0";"INSERT";"rek";"public";"TABLE_PREF";"EXECUTE PROCEDURE "TABLE_PREF_BIU0"()";"ROW";"BEFORE"

"rek";"public";"TABLE_PREF_BIU0";"UPDATE";"rek";"public";"TABLE_PREF";"EXECUTE PROCEDURE "TABLE_PREF_BIU0"()";"ROW";"BEFORE"

"rek";"public";"TABLE_PREF_BIU2";"INSERT";"rek";"public";"TABLE_PREF";"EXECUTE PROCEDURE "TABLE_PREF_BIU2"()";"ROW";"BEFORE"

"rek";"public";"TABLE_PREF_BIU2";"UPDATE";"rek";"public";"TABLE_PREF";"EXECUTE PROCEDURE "TABLE_PREF_BIU2"()";"ROW";"BEFORE"

10

Odp: Problem z domeną

Masz dwa triggery, które działają na tą samą operację na tej samej tabeli. Możesz pokazać kod tego drugiego (wystarczy funkcja)

11

Odp: Problem z domeną

wygląda na to, że sobie poradzilem z tym problemem.
Możliwe, że to jakiś bug postgresq, ale kiedy podałem jawnie w insercie wartości pole3 i pole4, to w końcu poszedł, triggery się uruchomiły i ustawiły odpowiednie wartości dla tych pól.

bez sensu było zrobione, że domena była not null, skoro jeszcze w definicji tabeli osoba, która ustawiała ten typ, zaznaczała od razu do tego not null. wychodziło podówjne not null...

zatem usunąłem z domenu opcję not null, wróciłem do poprzedniej wersji inserta i działa.

dodam na koniec, że nie ja pisałem tę bazę danych...

dziękuję za zainteresowanie i serdecznie pozdrawiam
misiek