» »

postgreSQL trigger

postgreSQL trigger

Zzzzzzz ::

živjo

torej, v PG triggerju bi rad dobil vse vrednosti iz NEW in OLD objektov, ampak dinamično, ne "hardcodano" za vsako tabelo posebej.

v text[] array dobim seznam stolpcev za posamezno tabelo, zanima pa me, kako je možno (če sploh je) dostopati do NEW in OLD preko "dinamičnih" imen stolpcev, tako da bi do njih dostopal npr. takole:
DEFINE
stolpci TEXT[];
BEGIN
stolpci = get_stolpci_for_table('ime_tabele');
RAISE NOTICE 'stolpec: %, vrednost: %', stolpci[0], NEW.stolpci[0];
END;

in bi (recimo da je prvemu stolpcu ime "naslov") PG upšteval NEW.stolpci[0] kot NEW.naslov. se to sploh da?

WarpedGone ::

hmmm, interesting :)

Trigger maš vedno obešen na točno določeno tabelo, se pravi da u principu veš njene stolpce. Pač dinamično kreiraj trigger in v njega zapeč ustrezna imena stolpcev v odvisnosti od tabele na katero ga obešaš. Izi :)
Zbogom in hvala za vse ribe

Zzzzzzz ::

you're right... ampak to je vse lepo in prav, če imaš nekaj tabel z nekaj stolpci. povsem drugače je, če imaš nekaj deset, sto tabel, ki tudi imajo kar nekaj stolpcev... ://

to bo neke vrste "auditing" tabel. moja ideja je v tem, da bi uporabil isto trigger proceduro za vse tabele kjer le-to potrebujem. procedura bi potem dinamično prebrala stolpce posamezne tabele ter ustrezno zapisala spremembe. v tem primeru odpade tudi "posodabljanje" triggerjev, ko npr. dodaš enega ali več novih stolpcev.

potem je pa tu še nekaj... v trigger rabim podat še en parameter, ampak triggerji ne podpirajo dinamičnih parametrov. zato me zanima, a lahko parameter vpišem v temp tabelo, ga preberem v triggerju, potem ga pa pobrišem iz temp tabele ter nato vse skupaj "zapakiram" v transakcijo:

BEGIN;
INSERT INTO temp_table ("parameter") VALUES('vrednost_parametra');
INSERT/UPDATE/DELETE statement (tukaj se izvede trigger)
DELETE FROM temp_table WHERE parameter='vrednost_parametra';
COMMIT;

Zgodovina sprememb…

  • spremenil: Zzzzzzz ()

Seadoo ::

Sicer v PG še nisem pisal triggerjev, jih pa v Oraclu kr pogosto. V bistvu ne vem niti za Oracle če lahko dinamično dostopaš do new in old vrednosti dinamično.

Kar me zanima je, zakaj bi to potreboval? Glede na izkušnje ti povem, da se za veliko takšnih čudnih vprašanj izkaže, da so posledica napačnega designa. Se pač stvari lotiš drugače.

Tisto glede transakcije pa bi moralo delovati, torej pišeš v temp tabelo, izvedeš insert/update/delete, pobrišeš temp tabelo. Oracle podpira temp tabele, ki ti jih recimo ni potrebno brisati, lahko to baza naredi ob commitu ali ob koncu seje.
Out of my mind. Back in five minutes.

frudi ::

če si hočeš prihraniti pisanje triggerjev za vsako tabelo posebej, si pač naredi proceduro, ki prebere stolpce posamezne tabele in zgenerira ustrezen trigger. ko imaš tako proceduro, je tudi trivialno posodobiti triggerje ob spremembi stolpcev v tabeli.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

WarpedGone ::

ja, u mislih sm mel točno to kar pravi frudi. Ena procedura, kateri podaš ime tabele, ona pa nanjo obesi ustrezen triger.

Razumem pa tut, da obstoječi triggerji hitro zastarajo, ko se spreminja struktura tabel.
Tule bi bil uporabn trigger on alter or create :), ki bi klical to proceduro ob vsaki spremembi strukture tabele. A PG ma kej tazga, se mi niti ne sanja. Če nima, pač nardiš dost splošno proceduro, ki na en ukaz popravi vse triggerje.
Zbogom in hvala za vse ribe


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[SQL] primary key inkrementalno dodajanje (strani: 1 2 )

Oddelek: Programiranje
514701 (3891) ejresnevem
»

[SQL] Referenca na parameter v proceduri

Oddelek: Programiranje
71252 (965) Ahim
»

[SQL] Kako omejiti vrednost med parent in child tabelo?

Oddelek: Programiranje
71294 (1088) MrStein
»

sql-t stored procedure

Oddelek: Programiranje
10995 (862) detroit
»

[T-SQL] Kako vnest podatek v bazo in da ti hkrati vrne id?

Oddelek: Programiranje
162767 (2485) dmok

Več podobnih tem