ďťż
 
[Oracle] Chwilowe blokowanie triggera (dla jednej sesji) ďťż
 
[Oracle] Chwilowe blokowanie triggera (dla jednej sesji)
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • fantazia.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com