2016-03-03 49 views
2

问题:如何从我的开发系统导出数据库内容(包括触发器)并将数据导入到活动服务器,而不会在触发器触发时运行到错误1449 ?对不同用户使用触发器(MySQL错误1449)

在最近的一个php项目中,我广泛使用了mysql触发器,但是在从开发部署我的数据库到实时系统时遇到了一个问题。

E.g.我的触发器中的一个被定义如下

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 ; 

这触发了我的开发系统上使用的用户@本地主机这产生在上述语句中的[email protected]子句定义的(通过使用mysqldump生成的输出)。

根@本地不存在作为这会导致当过扳机被触发以下错误直播服务器上的用户(例如,通过使用update templates set...)通过现场系统用户

1449:该指定为一个定义(“根” @“localhost”的)用户不存在

目前我使用mysqldump --add-drop-table --user=root -p my_project > export.sql出口和mysql -u devuser -p my_project < export.sql导入数据。

出口/进口作品无懈可击。只有当我通过sql操作数据并触发了一个触发器时才会出现该错误。

编辑:

MySQL的版本是47年5月5日(生活和DEV)

+1

什么版本的MySQL使用?从MySQL的5.7.8版开始,您可以使用['--skip-definer'](http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer)。 – wchiquito

+0

谢谢你的提示,不幸的是不是我的选择,但添加到http://stackoverflow.com/questions/9446783/remove-definer-clause-from-mysql-dumps/ – maxhb

回答

1

一旦你出口到export.sql,接下来你需要通过sed的消毒使用正则表达式的触发线,像这样:

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 

触发器将由用户在默认情况下导入转储文件创建。