#php #mysql #database #triggers
#php #mysql #База данных #триггеры
Вопрос:
Итак, у меня есть сценарий, который я долго искал, но не могу найти ситуацию, когда возникают оба.
У меня есть база данных, в которой я хочу, чтобы при обновлении определенной таблицы выполнялся триггер для просмотра значений в этой таблице artworkjobs_production и во второй таблице artworkjobs. Я не согласен с тем, как структура данных была создана до того, как я пришел на борт; однако я хотел бы решить эту проблему без рефакторинга огромного количества кода.
Идея в том, что после выполнения определенных условий я бы хотел, чтобы триггер сработал и обновил дату для каждой обновляемой конкретной строки.
Вот базовый триггер, который я создал, я хочу знать правильный синтаксис, если возможно, чтобы настроить его как триггер?
CREATE TRIGGER createProductionScheduleDate
AFTER UPDATE ON artworkjobs_production
FOR EACH ROW
IF (((OLD.artworkjobs.deleted = 0) OR (NEW.artworkjobs.deleted = 0))
AND ((OLD.Status = 'Approved' OR OLD.scheduleForProd = 1) OR (NEW.Status = 'Approved' OR NEW.scheduleForProd = 1))
AND ((OLD.prod.isCompleted IS NULL OR OLD.prod.isCompleted = 'N') OR
(NEW.prod.isCompleted IS NULL OR NEW.prod.isCompleted = 'N'))
AND ((OLD.printDueDate <> '0000-00-00 00:00:00') OR (NEW.printDueDate <> '0000-00-00 00:00:00'))
AND (length(OLD.invoiceNumber) > 0) OR (length(NEW.invoiceNumber) > 0))
AND ((OLD.importance > 0) OR (NEW.importance > 0))
AND ((OLD.quantity > 0) OR (NEW.quantity > 0))) THEN
UPDATE artworkjobs_production
SET originalProdScheduleDate = now();
WHERE ON LEFT JOIN artworkjobs_production prod ON prod.jobid = id JOIN tblaccounts ON acc_id = CustomerID;
END$$
ПРИМЕЧАНИЕ: я немного поиграл и обновил свой синтаксис, но в конце получил сообщение об ошибке, что синтаксис неверен.
Вот новый код:
CREATE TRIGGER createProductionScheduleDate
AFTER UPDATE ON artworkjobs_production
FOR EACH ROW
BEGIN
UPDATE artworkjobs_production
LEFT JOIN artworkjobs artworkjobs
ON jobid = artworkjobs.id
SET originalProdScheduleDate = now()
WHERE (((OLD.artworkjobs.deleted = 0) OR (NEW.artworkjobs.deleted = 0))
AND ((OLD.artworkjobs.Status = 'Approved' OR OLD.artworkjobs.scheduleForProd=1 ) OR (NEW.artworkjobs.Status = 'Approved' OR NEW.artworkjobs.scheduleForProd=1 ))
AND ((OLD.isCompleted is Null OR OLD.isCompleted = 'N') OR (NEW.isCompleted is Null OR NEW.isCompleted = 'N'))
AND ((OLD.printDueDate <> '0000-00-00 00:00:00') OR (NEW.printDueDate <> '0000-00-00 00:00:00'))
AND (length(OLD.invoiceNumber) > 0) OR (length(NEW.invoiceNumber) > 0))
AND ((OLD.importance > 0) OR (NEW.importance > 0))
AND ((OLD.quantity > 0) OR (NEW.quantity > 0)))
END;
Комментарии:
1. mysql <> sql server. Я предполагаю, что из синтаксиса вы используете mysql. Код не будет таким же.
2. Sean <> является приемлемым оператором в MySQL. dev.mysql.com/doc/refman/5.7/en/comparison-operators.html
3. Я не думаю, что вы поняли мой комментарий. Я говорил, что вы пометили это как mysql, так и sql server. Это НЕ одно и то же. Мой комментарий не имел ничего общего с допустимыми операторами в mysql. Это было связано с правильной маркировкой ваших вопросов.
4. Ооо, теперь я понял, ха-ха, хороший каламбур, и я не знал, что sql server был помечен.