reseni zacykleni volani triggeru v PostgreSQL

Pavel Stehule stehule na kix.fsv.cvut.cz
Pátek Červenec 26 10:41:34 CEST 2002


Zdravim

Poraïte mi prosím, nevím jak slu¹nì vyøe¹it následující problém. Mám ¹estici
stejných tabulek (strukturou), které mohou u¾ivatelé editovat (INSERT,
UPDATE, DELETE). Data v tabulkách se pomocí triggrù sluèují do jiné tabulky
(se stejnou strukturou). Tato tabulka se pou¾ívá pro ètení. 

Napadají mne dvì mo¾nosti implementace. Výslednou tabulku nahradit pohledem.
Nevýhodou je slo¾itìj¹í trigger pro INSERT, UPDATE, a DELETE (primární klíè
musí být jednoznaèný napøíè ¹esticí tabulek). Výhoda - pohled není
editovatelný sám od sebe.

Druhá mo¾nost. Pou¾ít místo pohledu tabulku. Výhoda - nemusím se starat o
jednoznaènost klíèe, trigger na zdrojových tabulkách je primitivní, a ani o
ref. integritu.

CREATE OR REPLACE FUNCTION trig_build_reggeol_F() RETURNS OPAQUE AS '
BEGIN
  IF TG_OP = ''DELETE'' THEN
    DELETE FROM cv_RegGeol WHERE kod = OLD.kod;
    RETURN OLD;
  ELSE
    IF TG_OP = ''UPDATE'' THEN
      UPDATE cv_RegGeol SET kod = NEW.kod, nazev = NEW.nazev WHERE kod =
OLD.kod;
      RETURN NEW;
    ELSE
      INSERT INTO cv_RegGeol VALUES(NEW.kod, NEW.nazev);
      RETURN NEW;
    END IF;
  END IF;
END;
' LANGUAGE 'plpgsql';

Nevýhoda - u¾ivatelé mi mohou modifikovat tuto tabulku, pak obsah tabulku
nebude odpovídat obsahu zdojových tabulek. Pou¾ití triggru na cílové tabulce
mi nepomù¾e, v triggru nepoznám, jestli chce pøidávat u¾ivatel nebo trigger.
S pøístupovými právy jsem taky v koncích (tak by se to dalo o¹etøit u
Microsoft SQL serveru, ulo¾ená procedura má práva vlastníka a nikoliv toho,
kdo ji spustil). Napadá mi jedno øe¹ení, doèasnì odstranit trigger, provést
po¾adovanou operaci a trigger opìt nastavit. Existuje nìjaká elegantnìj¹í
mo¾nost? V tomto pøípadì mi nejde o rychlost, zmìn v tabulkách bude minimum
(jsou to èíselníky), spí¹e o èistotu øe¹ení.

Díky
Pavel Stìhule


Další informace o konferenci Databases