Discussion:
[PostgreSQL] warunkowe zaniechanie wykonania komendy SQL w wyzwalaczu
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Ryszard Halski
2011-05-05 09:53:59 UTC
Permalink
wyzwalacz zdefiniowany mniej wiecej tak:

create trigger sometrigger
before insert
on sometable
for each statement
execute procedure triggerfunction();

pytanie: czy mozna w triggerfunction() po zajsciu okreslonego warunku nie
pozwolic na wykonanie wlasciwego inserta inaczej niz przez:

raise exception ...

czyli zaniechac wykonania inserta /update, delete/ pod pewnym warunkiem
badanym wewnatrz funkcji wyzwalacza.

K.
hubert depesz lubaczewski
2011-05-05 10:16:25 UTC
Permalink
Post by Ryszard Halski
create trigger sometrigger
before insert
on sometable
for each statement
execute procedure triggerfunction();
pytanie: czy mozna w triggerfunction() po zajsciu okreslonego warunku nie
raise exception ...
czyli zaniechac wykonania inserta /update, delete/ pod pewnym warunkiem
badanym wewnatrz funkcji wyzwalacza.
return null;

depesz
--
The best thing about modern society is how easy it is to avoid contact with it.
http://depesz.com/
Ryszard Halski
2011-05-05 11:31:52 UTC
Permalink
Post by hubert depesz lubaczewski
return null;
tak bedzie wyzwalacza dla wierszy, mój ma byc dla polecenia.
na pgsql 9.0.2 'return null;' nie blokuje updatea.

K.
Piotr M Kuć
2011-05-05 14:03:29 UTC
Permalink
Post by Ryszard Halski
Post by hubert depesz lubaczewski
return null;
tak bedzie wyzwalacza dla wierszy, mój ma byc dla polecenia.
na pgsql 9.0.2 'return null;' nie blokuje updatea.
Zamiast się nad tym zastanawiać i rozwodzić wystarczyło rzucić okiem
do dokumentacji, mi to zajęło 5 minut a nie znam PG.


http://www.postgresql.org/docs/8.1/static/plpgsql-trigger.html

"Row-level triggers fired BEFORE may return null to signal the trigger
manager to skip the rest of the operation for this row. [...]
If a nonnull value is returned then the operation proceeds with that row value.
[...]
The return value of a BEFORE or AFTER statement-level trigger or an
AFTER row-level trigger is always ignored; it may as well be null.
However, any of these types of triggers can still abort the entire
operation by raising an error."

Reasumując, w statement-level trigerach błąd przetwarzania
musisz sygnalizować rzucając wyjątkiem.
--
Pozdrawiam, Piotr.Kuc-(szympans)-kuciak.net
Piotr Kuć
Ryszard Halski
2011-05-10 08:04:31 UTC
Permalink
Post by Piotr M Kuć
Zamiast się nad tym zastanawiać i rozwodzić wystarczyło rzucić okiem
do dokumentacji, mi to zajęło 5 minut a nie znam PG.
po pierwsze, jeśli się nie znasz to nie zabieraj głosu,
po drugie, mnie znalezienie tego zajęło 2 minuty.
Post by Piotr M Kuć
Reasumując, w statement-level trigerach błąd przetwarzania
musisz sygnalizować rzucając wyjątkiem.
napisałem to w pierwszym poście tego wątku;
zanim zaczniesz się dowartościowywać naucz się czytać

K.

Loading...