Я знаю, что этот вопрос задавали много раз, но общепринятые ответы мне не помогли. Но совершенно случайно я наткнулся на ответ.
Вот настройка: у меня была загрузка запросов (в основном CREATE TABLE), проходящих через соединение. Но CREATE TRIGGER продолжал бросать ужасную ошибку 2014 года. Это не было связано с открытыми курсорами, потому что это произошло, даже когда это была единственная команда в программе. Это, например, не удалось:
<?php $db = new PDO ($cnstring, $user, $pwd); $db->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute (PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute (PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $st = $db->query ("CREATE TRIGGER `CirclesClosureSync` AFTER INSERT ON Circles FOR EACH ROW BEGIN INSERT INTO CirclesClosure (ancestor, descendant) SELECT ancestor, NEW.ID from CirclesClosure WHERE descendant=NEW.Parent; INSERT INTO CirclesClosure (ancestor, descendant) values (NEW.ID, NEW.ID); END;"); $st->closeCursor(); ?>
Это похоже на другие проблемы, связанные с созданием хранимых процедур.
Это php 5.4.5, MySql 5.5, Windows XP (хотя это и не удалось в других окнах)
Немного поиграл, но я обнаружил, что когда я взял ATTR_EMULATE_PREPARES = ложь (по умолчанию это эмулировать), он работал:
<?php $db = new PDO ($cnstring, $user, $pwd); $db->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //$db->setAttribute (PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute (PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $st = $db->query ("CREATE TRIGGER `CirclesClosureSync` AFTER INSERT ON Circles FOR EACH ROW BEGIN INSERT INTO CirclesClosure (ancestor, descendant) SELECT ancestor, NEW.ID from CirclesClosure WHERE descendant=NEW.Parent; INSERT INTO CirclesClosure (ancestor, descendant) values (NEW.ID, NEW.ID); END;"); $st->closeCursor(); ?>
Надеюсь, это поможет кому-то
Триггер может быть создан через PDO :: exec (), даже если PDO :: ATTR_EMULATE_PREPARES = false:
<?php $db = new PDO ($cnstring, $user, $pwd); $db->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute (PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute (PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $db->exec("CREATE TRIGGER `CirclesClosureSync` AFTER INSERT ON Circles FOR EACH ROW BEGIN INSERT INTO CirclesClosure (ancestor, descendant) SELECT ancestor, NEW.ID from CirclesClosure WHERE descendant=NEW.Parent; INSERT INTO CirclesClosure (ancestor, descendant) values (NEW.ID, NEW.ID); END;");