Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak modyfikować tabele z ustawionym na niej triggerem
woj_tas
post
Post #1





Grupa: Zarejestrowani
Postów: 230
Pomógł: 36
Dołączył: 31.03.2006
Skąd: Zielona Góra

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


Witam.

Mam tabele odpowiedzi (id, tytul, kolejnosc) oraz ustawionego na niej wyzwalacz:
  1. CREATE OR REPLACE
  2. TRIGGER ODPOWIEDZI_TRG
  3. AFTER DELETE ON ODPOWIEDZI
  4. FOR EACH ROW
  5. DECLARE
  6. nr_pytania NUMBER(4);
  7. nr_kolejnosc NUMBER(4);
  8. BEGIN SELECT pytanie_id, kolejnosc INTO nr_pytania, nr_kolejnosc FROM odpowiedzi WHERE odpowiedz_id = :OLD.odpowiedz_id;
  9. UPDATE odpowiedzi SET kolejnosc = kolejnosc-1 WHERE (kolejnosc > nr_kolejnosc AND pytanie_id = nr_pytania);
  10. END;

Jak widac chciałbym w wyzwalaczu zmodyfikować kolumnę kolejność. Niestety otrzymuję błąd:
Cytat
tabela ODPOWIEDZI ulega mutacji, wyzwalacz/funkcja może tego nie widzieć


Pytanie brzmi w jaki sposób mogę działać na tabeli na której utworzony jest wyzwalacz?

Dodam tylko że znalazłem odpowiedź aby usunąć FOR EACH ROW ale niestety wtedy nie będę miał dostępu do :NEW i :OLD

Ten post edytował woj_tas 3.04.2008, 22:39:38
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
WojtusJ
post
Post #2





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 27.02.2009

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


Panie ciapol, oczywiście muszę się z Panem zgodzić jednak pojawiło się trochę filozofii z Pańskiej wypowiedzi...

Po pierwsze - sprawa kosmetyczna - posługuje się Pan błędną terminologią. Pojęcie "relacji" występuje jedynie w Teorii Relacyjnej, podobnie jak krotka, atrybut, dziedzina czy schemat relacji. W naszym przypadku mowa ewidentnie o modelu fizycznym relacyjnej bazy danych, zatem powinno używać się pojęcia "Tabela" po prostu :-)

Po drugie działanie triggerem na tabeli na której jest ustawiony w sposób logiczny to bardziej jakaś magia. Problem woj_tas'a pojawił się z tego względu, że wyzwalacze FOR EACH ROW oraz wszystkie wywołane pośrenio przez DELETE CASCADE nie mogą czytać ani pisać w mutating tables, czyli tabelach które wyzwoliły zmianę (z małym wyjątkiem o którym zaraz) - to jest ten problem. W starszych wersjach nie mogły również modyfikować kluczy w constraining tables.

Uściślając (wspomniany wyjątek), wyzwalacz FOR EACH ROW nie ma dostępu do innych wierszy zmieniającej się tabeli, CHYBA ŻE jest to wyzwalacz BEFORE | AFTER INSERT FOR EACH ROW wyzwolony przez wstawianie pojedynczego wiersza.

Ta 'logika' wyczerpuje temat ;-)

Powodzenia!
Go to the top of the page
+Quote Post

Posty w temacie


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: 5.04.2026 - 20:34