Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z wyzwalaczem
Forum PHP.pl > Forum > Bazy danych > MySQL
szypi1989
  1. otóż mam problem z wyzwalaczem.oto jest kod sql:
  2. DELIMITER
  3.  
  4. CREATE TRIGGER tgr_nazwy
  5. AFTER INSERT OR UPDATE OR DELETE ON documentsPictures
  6. FOR EACH ROW
  7. BEGIN
  8. IF (TG_OP = 'DELETE') THEN
  9. UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = OLD.`documentId` ORDER BY weight LIMIT 1) WHERE `documentId` = OLD.`documentId`;
  10. ELSE
  11. UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = NEW.`documentId` ORDER BY weight LIMIT 1) WHERE `documentId` = NEW.`documentId`;
  12. END IF;
  13. RETURN NEW;
  14. END;


proszę o pomoc,gdzie tu jest błąd
nospor
No ale dostajesz jakiś błąd czy coś?

AFTER INSERT OR UPDATE OR DELETE
Nie kojarzę by można było stosować OR tudzież wymieniać kilka czasów przy tworzeniu triggera
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
szypi1989
tak dostaje błąd:
#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 'OR UPDATE OR DELETE ON documentsPictures FOR EACH ROW BEGIN IF (TG_OP = 'D' at line 2
nospor
No to napisałem w poprzednim poscie o co chodzi.
skowron-line
Kod
AFTER INSERT OR UPDATE OR DELETE

takie rzeczy to w postgresql są możliwe.
szypi1989
ok.ale teraz jest taki błąd:
#1363 - There is no OLD row in on INSERT trigger
oto kod:
  1. DELIMITER
  2.  
  3. CREATE TRIGGER tgr_nazwy
  4. AFTER INSERT ON documentsPictures
  5. FOR EACH ROW
  6. BEGIN
  7. IF (TG_OP = 'DELETE') THEN
  8. UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = OLD.`documentId` ORDER BY weight LIMIT WHERE `documentId` = OLD.`documentId`;
  9. ELSE
  10. UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = NEW.`documentId` ORDER BY weight LIMIT WHERE `documentId` = NEW.`documentId`;
  11. END IF;
  12. RETURN NEW;
  13. END;
nospor
Trudno żeby INSERT miał OLD skoro to jest INSERT czyli tylko nowa wartość. OLD to ma UPDATE.
INSERT ma tylko NEW
szypi1989
aha no dobra:) a jak użyć takiego czegoś w mysql:AFTER INSERT OR UPDATE OR DELETE ON documentsPictures
tak abym mógł mieć INSERT albo coś tam coś tam
skowron-line
No i tu Cię zaskocze jeżeli chcesz mieć tego trigera dla inserta, update i delete to musisz go 3 razy wrzucić
szypi1989
przy UPDATE OLD także nie chodzi.
oto kod:
  1. delimiter
  2.  
  3. CREATE TRIGGER tgr_nazwy
  4. AFTER UPDATE ON documentsPictures
  5. FOR EACH ROW
  6. BEGIN
  7. IF (TG_OP = 'DELETE') THEN
  8. UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = OLD.`documentId` ORDER BY weight LIMIT WHERE `documentId` = OLD.`documentId`;
  9. ELSE
  10. UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = NEW.`documentId` ORDER BY weight LIMIT WHERE `documentId` = NEW.`documentId`;
  11. END IF;
  12. RETURN NEW;
  13. END;
Niktoś
Przecież tego Olda masz w podzapytaniu select ,a ktoś już mówił przecież ,że w selectcie nie ma old.
szypi1989
TAK TYLKO TERAZ DAŁĘM W UPDATE OLDA,już problem rozwiązałem:)
dzięki za pomoc:)
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-2025 Invision Power Services, Inc.