Názor k článku PostgreSQL 9.1 aneb stále vpřed od Logik - Díky za odpověď. Mě jde o triviální a...

  • Článek je starý, nové názory již nelze přidávat.
  • 2. 5. 2011 16:20

    Logik

    Díky za odpověď. Mě jde o triviální a přitom hrozně častý případ, kdy trigger reaguje na změnu nějaké hodnoty. Např. proto, aby jí zkontroloval, nebo aby vykonal nějakou akci. Nebo naopak o "úklid" při změně či rušení objektu. V drtivém počtu případů je přitom třeba něco dělat, pokud se hodnota změnila, přičemž stav NULL je ekvivalentní stavu před založním objektu. Nejde tedy o nějaké generické triggery, ale právě o malé jednoúčelové funkce.

    V současné době musím udělat pro každou operaci insert/update/de­lete jeden trigger, což vede k nečitelnému a hůř udržitelnému kódu (jedna kontrola je na třech místech), nebo tam musí bejt podmínka ve stylu
    (TG_OP = 'UPDATE' AND .... ) OR (TG_OP = 'INSERT' AND ...) OR
    což je nečitelné. Přitom by stačilo:
    (NEW.value IS DISTINCT FROM OLD.value)

    jen kdyby šlo nějak rozumně pracovat s OLD/NEW, když je nedefinované. Napadá mě spousta variant, jak to udělat, např.

    - Nedefinované OLD/NEW by bylo NULL, tak, jak to už od verze 8.4 tvrdí dokumentace :-)
    >> This variable is NULL in statement-level triggers and for INSERT operations.
    Chápu, proč se Vám to systémově nelíbí, ale vzhledem k tomu, že v současném stavu nelze OLD tam, kde je nedefinované používat, tak by tato úprava nic nerozbila, kód, který by mohl být po úpravě špatně by před úpravou neběžel vůbec. Pro rozlišení, zdali má OLD = NULL význam nedefinováno nebo definováno, ale NULL, by šlo užít TG_OP stejně jako dnes.

    - Kdyby to i přesto vadilo, tak doplněním nějakého přepínače do definice funkce, kterým by si člověk mohl nové chování explicitně zapnout. Např. zápis v následujícím tvaru by byl hezký a myslím i vcelku konzistentní (defaultní hodnota parametru).
    function f(OLD = NULL, NEW = NULL) returns trigger

    - Vytvořením funkce ekvivalentní COALESCE, která by z nedefinované hodnoty udělala definovanou. Podmínka typu
    (NEW.value IS DISTINCT FROM defined(OLD,NUL­L).value)
    nebo ještě lépe
    (NEW.value IS DISTINCT FROM defornull(OLD)­.value)
    je furt daleko čitelnější, než to, co se musí psát dnes.