Problem z poleceniem UPDATE na tabeli z triggerem

0

Witam,
zaistniała u mnie taka sytuacja.. Jakiś czas temu założyłem trigger na tabeli uzytkownicy (CREATE TRIGGER updateClub AFTER UPDATE ON uzytkownicy) który miał automatycznie reagować na wprowadzone zmiany i te dane uaktualnić w tabeli zawodnicy..

OK, wszystko do tego momentu grało..., ale teraz próbując wykonać zwykłe polecenie UPDATE na tabeli uzytkownicy:

UPDATE uzytkownicy SET admin = 0 WHERE idUzytkownika = 15 

otrzymuje błąd typu:

Can't update table 'uzytkownicy' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Z tego co dyczytałem, to nie można wykontać takiej operacji bo jest założona blokada przez trigger... Co mogę w takim wypadku zrobić? Przytoczone powyżej polecenie UPDATE ma za zadanie niejako usuwać administratora z aplikacji.. (więc taka funkcjonalność jest mi potrzebna..).

Pewnie został popełniony błąd gdzieś w trakcie projektowania całej bazy danych, no ale teraz to juz trochę za późno na większe poprawki.. (bo jutro pokazuje to na zaliczenie i chce uniknąć tylko sytuacji typu - "niedziałającej funkcji / wykrzaczenia aplikacji").

Czekam na sugestie :)

PS. Doczytałem, że czasami w takich sytuacja pomaga zamiana funkcji triggera z AFTER na BEFORE jednak to u mnie nic nie dało.. Dopiero po usunięciu triggera mogę zrobić update..

0

MySQL wyraźnie pisze, że w trigerze usiłujesz zmieniać tabelę uzytkownicy. A tej nie możesz zmieniać, bo to ona tę akcję wywołała. Pokaż kod tego triggera.

0

Wygląda to tak:

 
DELIMITER $$
CREATE TRIGGER updateKlubZawodnik AFTER UPDATE ON uzytkownicy
  FOR EACH ROW BEGIN
    SET @im = NEW.imieUzytkownika;
    SET @naz = NEW.nazwiskoUzytkownika;
    SET @ndk = NEW.nalezyDoKlubuUzytkownik;
    
    IF EXISTS (SELECT * FROM  zawodnicy WHERE imieZawodnika = @im AND nazwiskoZawodnika = @naz) THEN
       UPDATE zawodnicy SET nalezyDoKlubu = @ndk WHERE imieZawodnika = @im AND nazwiskoZawodnika = @naz;
    END IF;
  END$$
DELIMITER ;
0

Ok, na tabele zawodnicy jak juz wspomniałem jest analogiczny trigger..

DELIMITER $$
CREATE TRIGGER updateKlubUzytkownik AFTER UPDATE ON zawodnicy
  FOR EACH ROW BEGIN
    SET @im = NEW.imieZawodnika;
    SET @naz = NEW.nazwiskoZawodnika;
    SET @ndk = NEW.nalezyDoKlubu;
    
    IF EXISTS (SELECT * FROM  uzytkownicy WHERE imieUzytkownika= @im AND nazwiskoUzytkownika = @naz) THEN
       UPDATE uzytkownicy SET nalezyDoKlubuUzytkownik = @ndk WHERE imieUzytkownika = @im AND nazwiskoUzytkownika = @naz;
    END IF;
  END$$
DELIMITER ;

Prawdopodobnie jest tak jak piszecie tworzony jest cykl (okres :P )

1 użytkowników online, w tym zalogowanych: 0, gości: 1