[Oracle] Chwilowe blokowanie triggera (dla jednej sesji)
HuKawa - 13-11-2006 00:13
[Oracle] Chwilowe blokowanie triggera (dla jednej sesji)
Potrzebuję podczas wykonania jednej procedury na chwilę zablokowac trigger. Ogólnie jest on mi potrzebny ale pewnej wyjątkowej sytucji będzie mi przeszkadzał.
Robię to poprzez:
begin EXECUTE IMMEDIATE ' alter trigger schemat.nazwa_triggera DISABLE '; end;
Niestety blokuje on ten trigger dla całej bazy (wszystkich połączeń) - to jeszcze jakoś przeżyję ale co gorsze w wypaku wywalenia się procedury pomiedzy zablokowaniem a odblowowaniem triggera (np. na skutek błędu w danych) rollback nie powoduje jego odblokownia.
Czy da się jakoś inaczej blokować trigger - najlepiej tak aby zablokowac jego wywołanie tylko dla jednej sesji?
--------- HuKawa
Lucyna Witkowska - 13-11-2006 00:13
HuKawa <"hukawa"@wywalto.poczta.onet.pl> napisał: > Potrzebuję podczas wykonania jednej procedury na chwilę zablokowac trigger. > Ogólnie jest on mi potrzebny ale pewnej wyjątkowej sytucji będzie mi > przeszkadzał.
> Robię to poprzez: > begin EXECUTE IMMEDIATE ' alter trigger schemat.nazwa_triggera DISABLE > '; end;
> Niestety blokuje on ten trigger dla całej bazy (wszystkich połączeń) - > to jeszcze jakoś przeżyję ale co gorsze w wypaku wywalenia się procedury > pomiedzy zablokowaniem a odblowowaniem triggera (np. na skutek błędu w > danych) rollback nie powoduje jego odblokownia.
Mozna odblokowac trigger w wyjatku.
> Czy da się jakoś inaczej blokować trigger - najlepiej tak aby zablokowac > jego wywołanie tylko dla jednej sesji?
Nie, ale zwykle mozna tak zbudowac trigger by klauzulą WHEN wylapac ten szczegolny przypadek i nie wykonywac triggera. Za malo danych by powiedziec, czy tutaj da sie tak zrobic.
Pozdrowienia, -- Lucyna Witkowska
Michał Kuratczyk - 13-11-2006 00:13
HuKawa wrote: > Czy da się jakoś inaczej blokować trigger - najlepiej tak aby zablokowac > jego wywołanie tylko dla jednej sesji? A co ten trigger robi? Nie lepiej wsadzić jego funkcjonalność do procedury operującej na tej tabeli? Triggery są często nadużywane.
A jeśli koniecznie chcesz, to możesz użyć kontekstów: 1. Tworzysz kontekst: create context foo using bar 2. W triggerze operację wykonujesz tylko, gdy wartość z kontekstu nie zostało ustawiona na pewną wartość: if sys_context('foo', 'moj_trigger') != 'nie' then ... 3. W procedurze, która ma się wykonać bez triggera ustawiasz tę wartość: dbms_session.set_context('foo', 'moj_trigger', 'nie'); insert/update/delete... dbms_session.set_context('foo', 'moj_trigger', 'tak');
-- Michał Kuratczyk
HuKawa - 13-11-2006 00:13
Lucyna Witkowska napisał(a):
> Mozna odblokowac trigger w wyjatku.
No Fakt :o) Naprostrze rozwiązanie zawsze przychodzi ostatnie.
> Nie, ale zwykle mozna tak zbudowac trigger by klauzulą WHEN wylapac ten > szczegolny przypadek i nie wykonywac triggera. Za malo danych by > powiedziec, czy tutaj da sie tak zrobic.
Trigger na insercie wyczynia tam sobie różne rzeczy gdy użytkownik dopisze rekordzik. Moja procedurka karmi bazkę paroset tysiącami rekordów na raz i nie chcę żeby trigger wyczyniał te swoje "ekwilibrystyki" bo wychodzi mało wydajnie.
Pozdroofki :o) -------- HuKawa
Paweł Matejski - 13-11-2006 00:14
HuKawa wrote: > Lucyna Witkowska napisał(a): > >> Mozna odblokowac trigger w wyjatku. > > No Fakt :o) Naprostrze rozwiązanie zawsze przychodzi ostatnie. > > >> Nie, ale zwykle mozna tak zbudowac trigger by klauzulą WHEN wylapac >> ten szczegolny przypadek i nie wykonywac triggera. Za malo danych by >> powiedziec, czy tutaj da sie tak zrobic. > > Trigger na insercie wyczynia tam sobie różne rzeczy gdy użytkownik > dopisze rekordzik. > Moja procedurka karmi bazkę paroset tysiącami rekordów na raz i nie chcę > żeby trigger wyczyniał te swoje "ekwilibrystyki" bo wychodzi mało wydajnie.
Dodaj sobie kolumnę, w której będziesz zaznaczał czy dana pochodzi ze skryptu, czy z normalnej działalności. Oprócz załatwienia sprawy w triggerze, będziesz miał dodatkową informację przydatną w przypadku debuggingu. Oczywiście nie jest to idealne rozwiązanie pod względem wydajnosci (bo niestety trigger nadal będzie uruchamiany, tyle że właściwie nic nie będzie robił), ale ja bym się bał wyłączać trigger (jako, że jest to operacja nietransakcyjna).
-- P.M.
Michał Kuratczyk - 13-11-2006 00:14
Paweł Matejski wrote: > Dodaj sobie kolumnę, w której będziesz zaznaczał czy dana pochodzi ze > skryptu, czy z normalnej działalności. Oprócz załatwienia sprawy w > triggerze, będziesz miał dodatkową informację przydatną w przypadku > debuggingu. Oczywiście nie jest to idealne rozwiązanie pod względem > wydajnosci (bo niestety trigger nadal będzie uruchamiany, tyle że > właściwie nic nie będzie robił), ale ja bym się bał wyłączać trigger > (jako, że jest to operacja nietransakcyjna). Moje rozwiązanie daje ten sam efekt bez potrzeby dodawania kolumny. :-) No, z wyjątkiem informacji o tym, że dane są ze skryptu.
-- Michał Kuratczyk
wk - 13-11-2006 00:14
Użytkownik "Michał Kuratczyk" <kura@lj.pl> napisał w wiadomości news:eft9gu$7sh$1@news2.ipartners.pl... > HuKawa wrote: > > Czy da się jakoś inaczej blokować trigger - najlepiej tak aby zablokowac > > jego wywołanie tylko dla jednej sesji? > A co ten trigger robi? Nie lepiej wsadzić jego funkcjonalność do procedury > operującej na tej tabeli? Triggery są często nadużywane. > > A jeśli koniecznie chcesz, to możesz użyć kontekstów: > 1. Tworzysz kontekst: create context foo using bar > 2. W triggerze operację wykonujesz tylko, gdy wartość z kontekstu nie > zostało ustawiona na pewną wartość: > if sys_context('foo', 'moj_trigger') != 'nie' then ...
proponowałbym sprawdzac czy null, wtedy inne wejscia nie muszą mieć ustawianej żadnej wartości w tym atrybucie (inaczej we wszystkich innych sesjach musisz mieć ustawianie atrybutu 'moj_trigger' w kontekscie 'foo' na 'tak')
> 3. W procedurze, która ma się wykonać bez triggera ustawiasz tę wartość: > dbms_session.set_context('foo', 'moj_trigger', 'nie'); > ... > dbms_session.set_context('foo', 'moj_trigger', 'tak');
oczywiscie poprzez pakiet (w tym wypadku 'bar')
-- wk
Radosław Witkowicki - 13-11-2006 00:14
Michał Kuratczyk napisał(a): > A co ten trigger robi? Nie lepiej wsadzić jego funkcjonalność do procedury > operującej na tej tabeli? Triggery są często nadużywane.
O tak. I strasznie zamulają :).
HuKawa - 13-11-2006 00:14
Michał Kuratczyk napisał:
> A jeśli koniecznie chcesz, to możesz użyć kontekstów:
Dzięki za odpowiedzi. Na razie zostaję przy rozwiązaniu z odblokowaniem triggera w obsłudze wyjątku.
Konteksty mi się bardzo spodobały, choć tutaj ich nie wykorzystam.
Chcę uniknąć wielokrotnego wywoływania (trigger jest FOR EACH ROW), a w przypadku wywalenia się i tak musiałbym zmianę wartości kontekstu robić w wyjątku.
Pozdrawiam ------------ HuKawa
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
Oracle 19g +Insert +Insert +Insert...
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
MSSQL Express czy Oracle Express
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
zanotowane.pldoc.pisz.plpdf.pisz.plfantazia.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|