2016-03-03 1 views
2

Вопрос: Как я могу экспортировать содержимое базы данных (включая триггеры) из моей системы dev и импортировать данные на живой сервер без ошибок в работе 1449 при срабатывании триггера ?Использование триггеров с разными пользователями (ошибка MySQL 1449)

В недавнем проекте php я широко использую триггеры mysql, но столкнулся с проблемой при развертывании моей базы данных из dev в live system.

E.g. один из моих триггеров определяются следующим образом (вывод, сгенерированный с помощью mysqldump)

DELIMITER ;; 
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER update_template BEFORE UPDATE ON template 
FOR EACH ROW BEGIN 
    SET new.mod_date := now(); 
END */;; 
DELIMITER ; 

Этого триггер был определен в моей системе Dev с помощью пользователя корневых @ локальных, который создает пункт в заявлении выше [email protected].

корень @ локальный не существует, как пользователь на реальном сервере, который вызывает следующую ошибку, когда все триггер сработал (например, с помощью update templates set...) пользователем живых систем

1449: определен как DEFINER («корень» @ «локальный») пользователь не существует

в настоящее время я использую mysqldump --add-drop-table --user=root -p my_project > export.sql для экспорта и mysql -u devuser -p my_project < export.sql для импорта данных.

Экспортно-импортные работы безупречны. Ошибка возникает только в случаях, когда я манипулирую данными через sql и включается триггер.

Edit:

MySQL версии 5.5.47 (жить и DEV)

+1

Какие версии MySQL используют ?. Вы можете использовать ['--skip-definer'] (http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer) с версии 5.7.8 MySQL. – wchiquito

+0

Спасибо за подсказку, к сожалению, не вариант для меня, но добавили его в http://stackoverflow.com/questions/9446783/remove-definer-clause-from-mysql-dumps/ – maxhb

ответ

1

После того, как вы экспортировали в export.sql, следующий вам необходимо дезинфицировать свои линии запуска с использованием регулярных выражений с помощью СЭД, как это:

sed -i -- 's/^..!50003\sCREATE.....!50017\sDEFINER=.root...[^] * .....!50003\s\([^;]*\)/CREATE DEFINER=CURRENT_USER \1/g;s/^\s*\([^\*]*;\{0,1\}\)\s\{0,1\}\*\/;;$/\1;;/g' export.sql

Это работает на Linux, но если вы на Mac OS X, встроенный в SED команды не будет работать. Вам нужно будет сначала brew install gnu-sed, затем используйте gsed вместо sed в приведенной выше команде.

0

Используйте следующую команду sed, чтобы удалить часть DEFINER из файла дампа, а затем импортировать ее на свой сервер.

sed 's/\sDEFINER=`[^`]*`@`[^`]*`//' -i dumpfile.sql 

Триггеры будут созданы пользователем, импортирующим файл дампа по умолчанию.

Смежные вопросы