Witam,

Koledzy, chcę dokonywać wpisu do tabel sprawdzając wcześniej czy coś jest spoza zakresu zmiennej datetime.
Trigger / Wyzwalacz bazuje na porównaniu daty (dokładniej CONCATOwanej do DATETIME) wyciąganej z innej tabeli i sprawdzaniu warunku daty rzeczywistej NOW() z datą z bazy pomniejszonej o INTERVAL 10 minut. W zwykłym SELECT wszystko działa:

  1. SET @eurodate=(SELECT CONCAT(date,' ',start_time) FROM at20_football_games WHERE id=1);
  2. SELECT IF( now() <= (@eurodate -INTERVAL 10 MINUTE),'GOT MUCH TIME','DENIED');
  3.  
  4. SET @eurodate=(SELECT CONCAT(date,' ',start_time) FROM at20_football_games WHERE id=1);
  5. SELECT IF( '2012-06-08 20:45:00' <= (@eurodate -INTERVAL 10 MINUTE),'GOT MUCH TIME','DENIED');


Natomiast ja chcę wyzwalacz (wiem, mogę przcież to po php zrobić ale uparłem się, że robię progress w MySQL i koniecznie chcę aby mieć to na TRIGGER'ze) wink.gif

Oto "celownik":

  1. CREATE TRIGGER euro2012_allow_10m_before BEFORE INSERT ON at20_football_votes
  2. FOR EACH ROW
  3. BEGIN
  4. SET @eurodate=(SELECT CONCAT(g.date,' ',g.start_time) FROM at20_football_games g WHERE g.id=NEW.gid);
  5. IF now()<=(@eurodate -INTERVAL 10 MINUTE)
  6. THEN
  7. INSERT INTO `at20_football_votes` (vid,gid,score1,score2,condition,processed,counted) VALUES (NEW.vid,NEW.gid,NEW.score1,NEW.score2,NEW.condition,NEW.processed,NEW.counted);
  8. END IF;
  9. END;


ERROR MESSAGE
  1. CREATE TRIGGER euro2012_allow_10m_before BEFORE INSERT ON at20_football_votes
  2. FOR EACH
  3. ROW
  4. BEGIN
  5. SET @eurodate = ( SELECT CONCAT( g.date, ' ', g.start_time )
  6. FROM at20_football_games g
  7. WHERE g.id = NEW.gid )
  8.  
  9. MySQL zwrócił komunikat:
  10. #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4


Dopiero zaczynam zabawę z MySQL'owym programowaniem tak więc proszę o wyrozumiałość i o hint'a, siedzę w http://forums.mysql.com oraz http://dev.mysql.com ale nie mogę póki co wyczaić co robię źle.

PS. Próbowałem z alliasmi jak i bez nich w przykładzie z SELECT do przykładu z TRIGGER bezskutecznie.

Pozdrawiam

http://www.daniweb.com/web-development/dat...-syntax-problem
http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

Problemem był phpmyadmin oraz brak delimiter'a, shellem zadziałało, błędem było również tworzenie triggera before insert z insert co doprowadzało do pętlenia się i odrzucaniu wyzwalacza oraz niedopuszczanie do inserta, ostatecznie po zastosowaniu DELIMITER'a i odwróceniu warunku oraz użyciu SET wygląda to tak:

  1. DELIMITER //
  2. CREATE TRIGGER euro2012_allow_10m_before BEFORE INSERT ON `at20_football_votes`
  3. FOR EACH ROW BEGIN
  4. DECLARE eurodate datetime;
  5. SET @eurodate=(SELECT CONCAT(g.date,' ',g.start_time) FROM at20_football_games g WHERE g.id=NEW.gid LIMIT 1);
  6. IF now()>(@eurodate - INTERVAL 10 MINUTE)
  7. THEN
  8. SET NEW.gid=0;
  9. SET NEW.vid=0;
  10. END IF;
  11. END;
  12. DELIMITER //;