🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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)
#194339
Author: Tdobe
Date: Sat, 28 Feb 2015 09:02
17 lines
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)
#194341
Author: Stokrotka
Date: Sun, 01 Mar 2015 17:55
22 lines
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)
#194340
Author: homar
Date: Sun, 01 Mar 2015 23:08
21 lines
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)
#194342
Author: Daniel Gontarek
Date: Mon, 02 Mar 2015 12:43
25 lines
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