Marm
Marm

Reputation: 873

mysql trigger after update in both direction

I have the same trigger on two tables.

The first one:

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

The second one:

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

As I expected, it tries to do an infinite loop, what is obvious. But, good for me, it doesn't make it because an error is triggered because it cannot update the table just updated.

The problem, I'm using a php form to edit the url of a user and many other informations. If mysql triggers an error, I write it on the page.

The question, is there a way to tell mysql not to trigger an error for that procedure only?

Upvotes: 1

Views: 932

Answers (1)

Andreas Wederbrand
Andreas Wederbrand

Reputation: 39951

You can declare a handler for the error that ignores it.

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;

This is how you use it in a trigger (and I've just tried it)

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 ;

Edit: I've thought of another way. You use an global session variable like this:

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 ;

Upvotes: 2

Related Questions