szypi1989
22.02.2012, 11:14:15
otóż mam problem z wyzwalaczem.oto jest kod sql:
DELIMITER
CREATE TRIGGER tgr_nazwy
AFTER INSERT OR UPDATE OR DELETE ON documentsPictures
FOR EACH ROW
BEGIN
IF (TG_OP = 'DELETE') THEN
UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = OLD.`documentId` ORDER BY weight LIMIT 1) WHERE `documentId` = OLD.`documentId`;
ELSE
UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = NEW.`documentId` ORDER BY weight LIMIT 1) WHERE `documentId` = NEW.`documentId`;
END IF;
RETURN NEW;
END;
proszę o pomoc,gdzie tu jest błąd
nospor
22.02.2012, 11:17:40
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
22.02.2012, 11:43:24
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
22.02.2012, 11:45:52
No to napisałem w poprzednim poscie o co chodzi.
skowron-line
22.02.2012, 12:35:08
Kod
AFTER INSERT OR UPDATE OR DELETE
takie rzeczy to w postgresql są możliwe.
szypi1989
22.02.2012, 15:49:27
ok.ale teraz jest taki błąd:
#1363 - There is no OLD row in on INSERT trigger
oto kod:
DELIMITER
CREATE TRIGGER tgr_nazwy
AFTER INSERT ON documentsPictures
FOR EACH ROW
BEGIN
IF (TG_OP = 'DELETE') THEN
UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = OLD.`documentId` ORDER BY weight LIMIT WHERE `documentId` = OLD.`documentId`;
ELSE
UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = NEW.`documentId` ORDER BY weight LIMIT WHERE `documentId` = NEW.`documentId`;
END IF;
RETURN NEW;
END;
nospor
22.02.2012, 15:50:55
Trudno żeby INSERT miał OLD skoro to jest INSERT czyli tylko nowa wartość. OLD to ma UPDATE.
INSERT ma tylko NEW
szypi1989
22.02.2012, 16:01:54
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
22.02.2012, 16:34:02
No i tu Cię zaskocze jeżeli chcesz mieć tego trigera dla inserta, update i delete to musisz go 3 razy wrzucić
szypi1989
22.02.2012, 17:04:56
przy UPDATE OLD także nie chodzi.
oto kod:
delimiter
CREATE TRIGGER tgr_nazwy
AFTER UPDATE ON documentsPictures
FOR EACH ROW
BEGIN
IF (TG_OP = 'DELETE') THEN
UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = OLD.`documentId` ORDER BY weight LIMIT WHERE `documentId` = OLD.`documentId`;
ELSE
UPDATE `documents` SET `picture` = (SELECT `file` FROM `documentsPictures` WHERE `documentId` = NEW.`documentId` ORDER BY weight LIMIT WHERE `documentId` = NEW.`documentId`;
END IF;
RETURN NEW;
END;
Niktoś
22.02.2012, 17:22:49
Przecież tego Olda masz w podzapytaniu select ,a ktoś już mówił przecież ,że w selectcie nie ma old.
szypi1989
22.02.2012, 17:58:25
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.