Reputation: 873
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
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