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
lukskrodz
post
Post #2





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 19.05.2008

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


A probowałes usunać
FOR EACH ROW
i zamiast tego dać:
REFERENCING NEW AS NEW OLD AS OLD;
Go to the top of the page
+Quote Post
ciapol
post
Post #3





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 31.01.2009

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


Cytat(lukskrodz @ 19.05.2008, 22:54:07 ) *
A probowałes usunać
FOR EACH ROW
i zamiast tego dać:
REFERENCING NEW AS NEW OLD AS OLD;

Po co pisać, że masło jest maślane?
Jeśli chcesz zmienić nazwę referencji to wpisujesz REFERENCING NEW AS inna_nazwa_new OLD AS inna_nazwa_OLD. A ponieważ nie zmieniłeś nic w nazewnictwie wpisujesz po prostu REFERENCING.
To raz. Dwa, Panie woj_tas nie można ustawić wyzwalacza bezpośrednio na DELETE relacji, a na perspektywie jak najbardziej :-) Kolejna sprawa jest taka, że można operować na relacji na której jest ustawiony trigger, ale należy to robić w sposób logiczny np:
  1. CREATE OR REPLACE TRIGGER weryfikacja_numeru_nowej_bandy
  2. BEFORE INSERT ON Bandy
  3. FOR EACH ROW
  4. DECLARE
  5. ile_jest bandy.nr_bandy%TYPE;
  6. BEGIN SELECT COUNT(*) INTO ile_jest FROM Bandy;
  7. IF :NEW.nr_bandy!=(ile_jest+1) THEN :NEW.nr_bandy:=(ile_jest+1); END IF;
  8. END;
  9. /
  10. SHOW ERRORS;

Powodzenia i pozdrawiam
MW
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