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 Test