Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> trigger na tej samej tabeli
nospor
post
Post #1





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Mam procedurę, ktora zmienia mi wartosc pola POLE na 4, ale tylko dla tych rekordów, których mają aktualnie wartosc pola 3.

Teraz przy UPDATE pola wywoluje trigger (before), ktory wykonuje mi powyższą procedurę, ale tylko wowczas, gdy nowa wartosc pola to 3. Czyli defacto nie ma zapętlenia żadnego, jednak oracle nie pozwala na takie numery. Czy mozna jakos trigger wywolac by lał na to i dzialał? Bo teraz oracle tak jakby podejrzewa ze moze byc zapetlenie, gdyz wywoluje trigger, a w nim wywoluje procedure ktora znowu mi ten sam trigger wzbudza. Jednak ten trigger z procedury nie wywola zadnych zmian, gdyz nowa wartosc pola to 4 nie 3.
Jak ktos zalapal oco biega i jakims cudem zna rozwiązanie to bardzo prosze o cynk.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Synaps
post
Post #2





Grupa: Zarejestrowani
Postów: 103
Pomógł: 0
Dołączył: 1.12.2003
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


OK, skoro twierdzisz że logika jest poprawna , spróbuje podać Ci sposób aby wprowadzić ten plan w życie (IMG:http://forum.php.pl/style_emoticons/default/cool.gif)
Będzie trochę skrótów , ale mam nadzieje że sobie poradzisz, w razie czego postaram się pomóc.

Do rzeczy :

1) Stwórz pakiet z dwoma procedurami :
- dodanie do listy (np add_to_list )
- zatwierdzenie zmian ( np save )

Aby zapewnić pojedyńcze i mass update'y najlepiej zadeklarować w pakiecie tablice, która będzie zawierać pola , dzięki którym będzie można dokładnie określić rekord w tabeli. Już tłumacze - tablica ta będzie wykorzystywana do 'zapamiętania' modyfikowanych rekordów ( 'zapamiętywać' będzie pierwszy trigger 'A'), następnie na jej podstawie trigger 'B' ;-) dokona modyfkacji.

2) Stwórz trigger na tabeli
  1. CREATE OR REPLACE TRIGGER DUMMY_TBL_A_TRG
  2. AFTER INSERT OR UPDATE
  3. ON DUMMY_TBL
  4. REFERENCING NEW AS NEW OLD AS OLD
  5. FOR EACH ROW


W kodzie zaimplementuj 'zapamiętywanie' np
  1. ...
  2. moj_pakiet.add_to_list(:NEW.id_pola,:new.pole);
  3. ...


3) Stwórz drugi trigger, tutaj już podam pełny przykład

  1. CREATE OR REPLACE TRIGGER DUMMY_TBL_B_TRG
  2. AFTER UPDATE ON DUMMY_TBL
  3. BEGIN moj_pakiet.save;
  4. END;



Jak łatwo się domyśleć procedura SAVE powinna zawierać sprawdzanie warunków i update tabeli DUMMY_TABLE.

Na koniec małe wyjaśnienie i ostrzeżenie (IMG:http://forum.php.pl/style_emoticons/default/aaevil.gif) Rozwiązując ten problem wykorzystujemy właściwość pakietów - w obrębie sesji zmienne pakietowe są wspólne , dzięki czemu jeden trigger zapamiętuje rekordy a drugi dokonuje ich modyfikacji. Jednak niesie to ze sobą pewne niebezpieczeństwo - należy pamiętać aby w odpowiednim momencie wyczyścić tabele która zapamiętuje rekordy (jeśli istnieje taka potrzeba ) - można to zrobić np w dodatkowych triggerze BEFOR UPDATE.

Ten post edytował Synaps 12.12.2006, 03:11:23
Go to the top of the page
+Quote Post

Posty w temacie
- nospor   trigger na tej samej tabeli   5.12.2006, 15:41:53
- - KILIUSZKIN   Znalazłem taką korespondecję : 1....   6.12.2006, 12:43:23
- - nospor   hmmm, ale to musze widok dodatkowy tworzyc?   6.12.2006, 12:51:41
- - php programmer   Troche głupie, ale może w triggerze zamiast zapyt...   6.12.2006, 13:46:56
- - nospor   @php programmer hehe, no jest to pewne rozwiązanie...   6.12.2006, 13:51:28
- - php programmer   Mam, tworzysz sobie drugą tabele (która nie zawie...   6.12.2006, 13:55:52
- - nospor   dzieki, ale ja wlasnie chcialem uniknac tworzenia ...   6.12.2006, 14:02:37
- - php programmer   OK jeszcze jedna próba, nie wiem czy to sie da w o...   6.12.2006, 14:04:20
- - nospor   no i ja wlasnie tak mam: w trigerze wywoluje proce...   6.12.2006, 14:06:27
- - php programmer   To może fukcja wywołana przez trigger zamist wykon...   6.12.2006, 14:19:31
- - nospor   hehe, nie. niezaleznie ile tych funkcji bedziesz m...   6.12.2006, 14:21:04
- - Synaps   Nie wiem czy dobrze zrozumiałem : - UPDATE danych...   6.12.2006, 16:05:36
- - nospor   CytatUPDATE danych nigdy nie pozwoli na ustawienie...   6.12.2006, 16:12:36
|- - Sedziwoj   Cytat(nospor @ 6.12.2006, 16:12:36 ) ...   11.12.2006, 17:23:04
- - Synaps   OK, skoro twierdzisz że logika jest poprawna ...   11.12.2006, 15:27:32
- - nospor   @Synaps wow Sek w tym, ze chcialem uniknac dodatk...   11.12.2006, 18:17:01
|- - Sedziwoj   Cytat(nospor @ 11.12.2006, 18:17:01 )...   11.12.2006, 18:39:09
|- - Synaps   Cytat(nospor @ 11.12.2006, 20:17:01 )...   12.12.2006, 03:09:11
- - nospor   CytatJak na razie widzę, że POLE ma dwa ...   11.12.2006, 18:50:50
- - KILIUSZKIN   Nie wiem czy to zadziała (jutro jak będę miał czas...   11.12.2006, 22:57:54
- - nospor   @KILIUSZKIN a wiesz że juz to probowalem zrob...   11.12.2006, 23:09:28
- - nospor   aaa, no tak, ta tablica mnie zmylila. Poki co z or...   12.12.2006, 08:45:23


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 00:58