Thread View: pl.comp.bazy-danych
4 messages
4 total messages
Started by Tdobe
Sat, 28 Feb 2015 09:02
Oracle zapytanie do tabeli wewnątrz triggera (mutating)
Author: Tdobe
Date: Sat, 28 Feb 2015 09:02
Date: Sat, 28 Feb 2015 09:02
17 lines
1619 bytes
1619 bytes
Witam, Chciałbym w triggerze before delete sprawdzać czy kasowany rekord jest ostatnim. czyli coś takiego: select max(id) into last_id from table; if (last_id is not null and last_id <> :old.id) then raise_exception(...) end if; Jednak taka konstrukcja wywala mutację tabeli (w sumie racja bo odczyt tabeli ktora wlasnie jest zmieniana). Czy w takim przypadku deklaracja pragma autonomous_transaction jest dobrym wyjściem czy inaczej to można rozwiązać, ma ktoś pomysła? Tomek
Re: Oracle zapytanie do tabeli wewnątrz triggera (mutating)
Author: Stokrotka
Date: Sun, 01 Mar 2015 17:55
Date: Sun, 01 Mar 2015 17:55
22 lines
1500 bytes
1500 bytes
>Chciałbym w triggerze before delete sprawdzać czy kasowany rekord jest >ostatnim. >czyli coś takiego: >select max(id) >into last_id >from table; >if (last_id is not null and last_id <> :old.id) then > raise_exception(...) >end if; A po co ci to? Jak cofasz transakcję , to zwykle inaczej się to realizuje, ale na oraclu się nie znam. -- (tekst bez: ó, ch, rz i -ii) Ortografia to NAWYK, często nielogiczny, ktury ludzie ociężali umysłowo, nażucają bezmyślnie następnym pokoleniom. http://ortografia.3-2-1.pl/
Re: Oracle zapytanie do tabeli wewnątrz triggera (mutating)
Author: homar
Date: Sun, 01 Mar 2015 23:08
Date: Sun, 01 Mar 2015 23:08
21 lines
2414 bytes
2414 bytes
W dniu sobota, 28 lutego 2015 10:02:09 UTC+1 użytkownik Tdobe napisał: > Witam, > > Chciałbym w triggerze before delete sprawdzać czy kasowany rekord jest ostatnim. > > czyli coś takiego: > > select max(id) > into last_id > from table; > > if (last_id is not null and last_id <> :old.id) then > raise_exception(...) > end if; [...] Jeśli to ID jest unikalne, i jeśli jest, to musi być ostatnie w danym momencie. Myślę, że próbujesz obejść problem z wielodostępem, gdzie jakaś procedura jest w wielu wątkach odpalana, i pomiędzy selectem i deletem max może być podany w tej samej wielkości kilku wątkom. Można tu zrobić blokadę w określonym miejscu, wzorem dbfów, co zadziała wszędzie i będzie ok. Ale Oracle ma tu swoje wsparcie, tylko nie wiem od której wersji. Poczytaj o RETURNING INTO. Wtedy każdy wątek kasujący ID zwraca kasowaną wartość do zmiennej w jednej transakcji i nigdy się ta wartość między wątkami nie powtórzy. Pozdrawiam, Marek Horodyski
Re: Oracle zapytanie do tabeli wewnątrz triggera (mutating)
Author: Daniel Gontarek
Date: Mon, 02 Mar 2015 12:43
Date: Mon, 02 Mar 2015 12:43
25 lines
1735 bytes
1735 bytes
W dniu 2015-02-28 o 10:02, Tdobe pisze: > Witam, > > Chciałbym w triggerze before delete sprawdzać czy kasowany rekord jest ostatnim. > > czyli coś takiego: > > select max(id) > into last_id > from table; > > if (last_id is not null and last_id <> :old.id) then > raise_exception(...) > end if; > > Jednak taka konstrukcja wywala mutację tabeli (w sumie racja bo odczyt tabeli ktora wlasnie jest zmieniana). Czy w takim przypadku deklaracja pragma autonomous_transaction jest dobrym wyjściem czy inaczej to można rozwiązać, ma ktoś pomysła? > > Tomek > Od wersji 11 jest dostępny mechanizm compound triggers. Może się przydać w takich problemach -- gont
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads