Strona 1 z 1

SQL (MYSQL) TRIGGER błąd 1442 - czy można go obejść?

: 23 listopada 2011, 16:08
autor: sethiel
Zgodnie z informacją z wątku nie udało mi się zrobić funkcji TRIGGER AFTER/BEFORE UPDATE, która dotyka wiersza w którym wywoływany jest wyzwalacz.
Sam wyzwalacz (uproszczony) wygląda tak:

Kod: Zaznacz cały

CREATE TRIGGER after_tabela_update
AFTER UPDATE ON tabela
FOR EACH ROW 
BEGIN
        UPDATE tabela as t1 , tabela as t2
        set t1.kolumna1 = t2.kolumna1
        WHERE jakis_warunek;
END
Funkcja przechodzi, jednakże wysypuje się przy wykonaniu zapytania UPDATE na tabeli tabela - ponieważ chciałaby się wykonywać w kółko.
Czy można jakoś to obejść, coś na kształt:

Kod: Zaznacz cały

CREATE TRIGGER after_tabela_update
AFTER UPDATE ON tabela [B]WHERE tabela.kolumna = 'wartosc' #czyli aby TRIGGER dzialal tylko gdy UPDATE wykonywany jest na okreslonym warunkiem wierszu[/B]
FOR EACH ROW 
BEGIN
        UPDATE tabela as t1 , tabela as t2
        set t1.kolumna1 = t2.kolumna1
        WHERE jakis_warunek;
END [B]
exit() # ? funkcja która nie pozwalała by na odpalenie kolejnego wyzwalacza [/B]
Czy ktoś miał taki problem i jakoś go obszedł.

Jeszcze oryginalny komunikat błędu którego to dotyczy:
#1442 - Can't update table 'tabela' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

: 24 listopada 2011, 13:04
autor: mariaczi

: 24 listopada 2011, 16:02
autor: sethiel
Obecnie zgodnie z komunikatem błędu serwer mysql nie potrafi zrealizować zapytania UPDATE na tabeli, na której wykonywany jest TRIGGER AFTER/BEFORE UPDATE.
I w tym cały szkopuł.
Usiedziałem się już parę ładnych chwil by wydumać jakieś obejście ale nic z rozsądkiem do głowy nie przychodzi.

Co chcę by wykonywało się w praktyce:
Zmieniany jest rekord w tabeli w kolumnie x, zaraz po zmienie ma się odpalić wyzwalacz który sprawdzi czy ten wpis przypadkiem nie powinien być przepisany do jeszcze jednego wiersza w tej samej tabeli, innymi słowy
tabela A

Kod: Zaznacz cały

kolumna 1, kolumna2, kolumna3
a,a,a
b,b,a
ca,ca,c
db,db,c
Jeśli zaktualizowany zostal wpis a,a,a na a,aa,a to zmien ca,ca,c na ca,caa,c.

Póki co z braku laku mam zrobiony w cronie skrypt uruchamiany co dwie minuty który leci i to robi.
Ale wolałbym bardziej elegancko to rozwiązać.