MySQL триггер после обновления в обоих направлениях - PullRequest
1 голос
/ 22 декабря 2011

У меня один и тот же триггер на двух столах.

Первый:

CREATE TRIGGER updateURL1 AFTER UPDATE ON table1
FOR EACH ROW
BEGIN
    UPDATE table2 SET url=NEW.url WHERE uname=NEW.uname;
END;

Второй:

CREATE TRIGGER updateURL2 AFTER UPDATE ON table2
FOR EACH ROW
BEGIN
    UPDATE table1 SET url=NEW.url WHERE uname=NEW.uname;
END;

Как я и ожидал, он пытается сделать бесконечный цикл, что очевидно. Но, хорошо для меня, это не так, потому что возникает ошибка, потому что он не может обновить только что обновленную таблицу.

Проблема, я использую форму php для редактирования URL-адреса пользователя и многих других сведений. Если mysql вызывает ошибку, я пишу это на странице.

Вопрос, есть ли способ сказать mysql не вызывать ошибку только для этой процедуры?

1 Ответ

2 голосов
/ 22 декабря 2011

Вы можете объявить обработчик для ошибки, которая его игнорирует.

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;

Вот как вы используете его в триггере (и я только что попробовал)

DROP TRIGGER updateURL1;
DROP TRIGGER updateURL2;

DELIMITER //
CREATE TRIGGER updateURL1 AFTER UPDATE ON table1
FOR EACH ROW
BEGIN       
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
    UPDATE table2 SET url=NEW.url WHERE uname=NEW.uname;
END//

CREATE TRIGGER updateURL2 AFTER UPDATE ON table2
FOR EACH ROW
BEGIN
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
    UPDATE table1 SET url=NEW.url WHERE uname=NEW.uname;
END//

DELIMITER ;

Редактировать: Я думал о другом пути. Вы используете глобальную переменную сеанса, как это:

DROP TRIGGER updateURL1;
DROP TRIGGER updateURL2;

DELIMITER //
CREATE TRIGGER updateURL1 AFTER UPDATE ON table1
FOR EACH ROW
BEGIN       
  IF @protector IS NULL THEN
    SET @protector=1;
    UPDATE table2 SET url=NEW.url WHERE uname=NEW.uname;
    SET @protector=null;
  END IF;
END//

CREATE TRIGGER updateURL2 AFTER UPDATE ON table2
FOR EACH ROW
BEGIN
  IF @protector IS NULL THEN
    SET @protector=1;
    UPDATE table1 SET url=NEW.url WHERE uname=NEW.uname;
    SET @protector=null;
  END IF;
END//

DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...