Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Trigger - błąd
Forum PHP.pl > Forum > Bazy danych > MySQL
szewciu
Witam,
chciałbym utworzyć trigger, który do specjalnie utworzonej tabeli będzie zapisywał wprowadzane zmiany w pewnym polu. Oto kod:

  1. CREATE TRIGGER przesylka
  2. BEFORE UPDATE ON `tserwis`
  3. FOR EACH ROW
  4. BEGIN
  5. IF new.IdStatusSt != old.IdStatusSt
  6. INSERT INTO tprzesylki(informacja)
  7. VALUES ( CONCAT("przesylka nr ",`tserwis`.`IdSerwisSe`, "zmienila status z", old.IdStatusSt, "na ", new.IdStatusSt))
  8. );
  9. END IF;
  10. END;


MySQL zwraca błąd: #1064 - Something is wrong in your syntax obok 'INSERT INTO tprzesylki(informacja)
VALUES (CONCAT("przesylka nr ",tserwis.IdSer' w linii 6


Utworzona tabela do tego celu prezentuje się tak:

  1. CREATE TABLE tprzesylki(
  2. id int AUTO_INCREMENT PRIMARY KEY,
  3. informacja varchar(255)
  4. );


Będę wdzięczny za pomoc w rozwiązaniu tego problemu, ponieważ jest to moje pierwsze podjęcie działania na wyzwalaczach dlatego też proszę o wyrozumiałość smile.gif

Z góry dziękuję i pozdrawiam.
nospor
http://dev.mysql.com/doc/refman/5.0/en/if-statement.html
Zobacz jak wygląda poprawny IF, jakie zawiera słowa kluczowe a jakich brakuje u Ciebie
szewciu
Dodałem THEN lecz wątpię, aby o to Ci chodziło.

  1. CREATE TRIGGER przesylka
  2. BEFORE UPDATE ON `tserwis`
  3. FOR EACH ROW
  4. BEGIN
  5. IF new.IdStatusSt != old.IdStatusSt THEN
  6. INSERT INTO tprzesylki(informacja)
  7. VALUES ( CONCAT("przesylka nr ",`tserwis`.`IdSerwisSe`, "zmienila status z", old.IdStatusSt, "na ", new.IdStatusSt));
  8. END IF;
  9. END;


Teraz błąd jest: #1064 - Something is wrong in your syntax obok '' w linii 7

Coś źle z INSERTem albo CONCATem?
nospor
Cytat
Dodałem THEN lecz wątpię, aby o to Ci chodziło.
Inny bład? Inny. Więc o to chodziło.

Mysql jako ciapków używa ' a nie "
szewciu
  1. CREATE TRIGGER przesylka
  2. BEFORE UPDATE ON `tserwis`
  3. FOR EACH ROW
  4. BEGIN
  5. IF new.IdStatusSt != old.IdStatusSt THEN
  6. INSERT INTO tprzesylki(informacja)
  7. VALUES ( CONCAT('przesylka nr ',`tserwis`.`IdSerwisSe`, 'zmienila status z', old.IdStatusSt, 'na ', new.IdStatusSt));
  8. END IF;
  9. END;


#1064 - Something is wrong in your syntax obok '' w linii 7

mortus
Chyba id przesyłki musisz pobrać inaczej niż `tserwis`.`IdSerwisSe`, bo to chyba ma być wartość ze starego rekordu, a nie ze wszystkich wierszy kolumny IdSerwisSe w tabeli tserwis.
nospor
Mnie to jeszcze zastanawia, że wszędzie dajesz średniki, nawet za ostatnim END. Ja zawsze musiałem ustawiać delimeter na np. $$ i ostatni END właśnie kończyłem tym $$
szewciu
Cytat(mortus @ 3.06.2011, 12:45:23 ) *
Chyba id przesyłki musisz pobrać inaczej niż `tserwis`.`IdSerwisSe`, bo to chyba ma być wartość ze starego rekordu, a nie ze wszystkich wierszy kolumny IdSerwisSe w tabeli tserwis.


No tak, to fakt. Ale jaki jest na to sposób? Bo faktycznie nie zwróciłem na to uwagi... Chciałbym zapisać w tej kolumnie informacja zlecenie nr [id zlecenia ktorego status sie zmienil] zmienilo status z old... na new...
wookieb
  1. DELIMITER ||
  2.  
  3. TWOJ TRIGGER ZAKONCZONY ||
  4.  
  5. DELIMITER ;
mortus
Sprawdź proszę w manualu mySQL-a, czym jest OLD i NEW w trigger-ach.
szewciu
Nawet gdy chcę utworzyć inny, prostszy, wciąż zwracany jest ten sam błąd

  1. CREATE TABLE tzwroty(
  2. id int AUTO_INCREMENT PRIMARY KEY,
  3. informacja varchar(255)
  4. );
  5.  
  6. CREATE TRIGGER zwroty
  7. BEFORE UPDATE ON tserwis
  8. FOR EACH ROW
  9. BEGIN
  10. IF new.ZwrotDataSe != old.ZwrotDataSe
  11. OR (old.ZwrotDataSe IS NULL OR old.ZwrotDataSe=0000-00-00) AND new.ZwrotDataSe IS NOT NULL then
  12. INSERT INTO tzwroty(informacja)
  13. VALUES ( CONCAT('zlecenie zakonczono', COALESCE(new.ZwrotDataSe,'NULL'))
  14. );
  15. END IF;
  16. END;//


#1064 - Something is wrong in your syntax obok '' w linii 9
wookieb
Nadal nie zastosowałeś DELIMITER...
szewciu
  1. DELIMITER ||
  2. CREATE TRIGGER zwroty
  3. BEFORE UPDATE ON tserwis
  4. FOR EACH ROW
  5. BEGIN
  6. IF new.ZwrotDataSe != old.ZwrotDataSe
  7. OR (old.ZwrotDataSe IS NULL OR old.ZwrotDataSe=0000-00-00) AND new.ZwrotDataSe IS NOT NULL then
  8. INSERT INTO tzwroty(informacja)
  9. VALUES ( CONCAT('zlecenie zakonczono', COALESCE(new.ZwrotDataSe,'NULL'))
  10. );
  11. END IF;
  12. END ||
  13. DELIMITER ;


Błąd
zapytanie SQL:

DELIMITER || CREATE TRIGGER zwrotyBEFORE UPDATE ON tserwis FOR EACH ROW BEGIN IF new.ZwrotDataSe != old.ZwrotDataSe OR (

old.ZwrotDataSe IS NULL OR old.ZwrotDataSe =0000 -00 -00
) AND new.ZwrotDataSe IS NOT NULL THEN INSERT INTO tzwroty( informacja )
VALUES (
CONCAT( 'zlecenie zakonczono', COALESCE( new.ZwrotDataSe, 'NULL' ) )
);

END IF ;

END ||
MySQL zwrócił komunikat:

#1235 - This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'

Czyli co, mogę zapomnieć, że cokolwiek będzie działało jeśli chodzi o wyzwalacze?
nospor
No w wyzwalaczu na tabeli X nie możesz pisać do tabeli X

edit down: no tak, nie przeczytałem za dokładnie komunikatu. No ale to co napisałem to chyba też jest prawdziwe
wookieb
A nauczysz się czytać?
Jest napisane, że nie można podpiąć więcej niż 1 triggera pod tą samą tabelę pod to samo zdarzenie. To znaczy... że już jest jakiś trigger na tym zdarzeniu i musisz go najpierw usunąć.
szewciu
Spokojnie człowieku, myślałem że tworzenie triggerów odbywa się w sposób transakcyjny - albo stworzy się cały albo wcale.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.