Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Trigger - błąd
szewciu
post 3.06.2011, 11:25:13
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 20.05.2010

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


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.
Go to the top of the page
+Quote Post
nospor
post 3.06.2011, 11:27:05
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
szewciu
post 3.06.2011, 11:34:11
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 20.05.2010

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


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?
Go to the top of the page
+Quote Post
nospor
post 3.06.2011, 11:42:49
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 "


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
szewciu
post 3.06.2011, 11:44:44
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 20.05.2010

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


  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

Go to the top of the page
+Quote Post
mortus
post 3.06.2011, 11:45:23
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
nospor
post 3.06.2011, 11:48:20
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 $$


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
szewciu
post 3.06.2011, 11:48:58
Post #8





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 20.05.2010

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


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...
Go to the top of the page
+Quote Post
wookieb
post 3.06.2011, 11:53:17
Post #9





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. DELIMITER ||
  2.  
  3. TWOJ TRIGGER ZAKONCZONY ||
  4.  
  5. DELIMITER ;


--------------------
Go to the top of the page
+Quote Post
mortus
post 3.06.2011, 11:54:20
Post #10





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Sprawdź proszę w manualu mySQL-a, czym jest OLD i NEW w trigger-ach.
Go to the top of the page
+Quote Post
szewciu
post 3.06.2011, 12:15:18
Post #11





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 20.05.2010

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


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
Go to the top of the page
+Quote Post
wookieb
post 3.06.2011, 12:16:45
Post #12





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Nadal nie zastosowałeś DELIMITER...


--------------------
Go to the top of the page
+Quote Post
szewciu
post 3.06.2011, 12:22:20
Post #13





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 20.05.2010

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


  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?
Go to the top of the page
+Quote Post
nospor
post 3.06.2011, 12:24:08
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Powód edycji: [nospor]:


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
wookieb
post 3.06.2011, 12:24:24
Post #15





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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ąć.


--------------------
Go to the top of the page
+Quote Post
szewciu
post 3.06.2011, 12:26:00
Post #16





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 20.05.2010

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


Spokojnie człowieku, myślałem że tworzenie triggerów odbywa się w sposób transakcyjny - albo stworzy się cały albo wcale.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.07.2025 - 06:12