mysql - проверка значения триггера перед обновлением - PullRequest
0 голосов
/ 26 сентября 2018


Я пытаюсь создать триггер, который проверяет, ниже ли зарплата сотрудника по сравнению с его менеджером после обновления, и прерывает обновление, если оно происходит.

CREATE TRIGGER Employee_BeforeUpdate
 BEFORE UPDATE ON Employee
  FOR EACH ROW
  BEGIN
   IF EXISTS (
     SELECT * FROM Manager, Manages
     WHERE NEW.eid = Manages.eid
     AND Manager.mid = Manages.mid
     AND NEW.salary > Manager.salary)
   THEN SIGNAL SQLSTATE '45000' SET message_text = 'Error message';
   END IF;
 END;

У меня синтаксическая ошибка (1064) рядом с '' в строке 9, и я не могу понять, почему.Также это правильный способ сделать триггер?

(MySql Версия 5.7.23-0ubuntu.18.04.1)

CREATE TABLE Employee (eid char(5), salary integer, primary key(eid));
CREATE TABLE Manager (mid char(5), salary integer, primary key(mid));
CREATE TABLE Manages (mid char(5), eid char(5) , primary key (mid,eid),
                      foreign key(mid) references Manager(mid),
                      foreign key(eid) references Employee(eid));

1 Ответ

0 голосов
/ 26 сентября 2018
  • Вам необходимо переопределить разделитель на что-то другое (например, $$) вместо (;).
  • Также в качестве меры безопасности проверьте, существует ли уже такой же триггер имениили нет (DROP TRIGGER IF EXISTS)
  • В конце переопределите DELIMITER на ;

Измените триггер на следующее:

DELIMITER $$
DROP TRIGGER IF EXISTS Employee_BeforeUpdate $$
CREATE TRIGGER Employee_BeforeUpdate
 BEFORE UPDATE ON Employee
  FOR EACH ROW
  BEGIN
   IF EXISTS (
     SELECT * FROM Manager, Manages
     WHERE NEW.eid = Manages.eid
     AND Manager.mid = Manages.mid
     AND NEW.salary > Manager.salary)
   THEN SIGNAL SQLSTATE '45000' SET message_text = 'Error message';
   END IF;
 END $$
DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...