30 июля 2016 г.

MS SQL и PHP PDO: вставка с триггером

В общем история такая.
Существует таблица в БД MS SQL с которой связан триггер. Триггер отвечает за аудит — сохраняет всю информацию о пользователе и его действиях при вставке, обновлении или удалении записи в этой таблица.

Так вот, столкнулся с проблемой, что при вставке данных, используя PHP PDO (в основе Zend Framework), вставка происходила успешно, но Zend вываливался в exception и не было ясно, что с этим делать. Я попытался создать новую таблицу, с парой полей, привязать к ней аналогичный триггер и получил ту же самую ошибку.

Изучая вопрос, я где-то натыкался на совет, что нужно указать NOCOUNT ON;
Я предполагаю, что PDO ждет ответ о изменении одного поля в результате вставки (обновления, удаления), но получает еще и ответ о срабатывании триггера, который в свою очередь также затрагивает одно поле и в итоговом счете в результата информация о изменении двух полей — это не нравится PDO и мы получаем ошибку.

Повторно эту рекомендацию нагуглить не удалось, но это было первое что я делал — в начале триггера, либо перед выполнением операции вставки я добавлял запрос NOCOUNT ON;, но это не приводило к успеху. И далее, что я только не пробовал — все было безуспешно. Даже поставил довольно классную программу по детальному логгированию всей информации по взаимодействию с MS SQL.

Решение оказалось довольно простым и все-таки использовало NOCOUNT ON; в качестве решения — здесь важным моментом было то, что эту команду обязательно нужно было использовать непосредственно перед запросом вставки в триггере аудита и в моем случае это была команда EXEC выполняющая предварительно сгенерированный запрос.

Проблема решилась.