问题的出现
问题是在我插入数据时发生的。在我插入数据时发生了如下错误:
The user specified as a definer (‘skip-grants user‘@‘skip-grants host‘) does not exist
大意是定义者‘skip-grants user‘@‘skip-grants host‘
不存在,可是我从来都没有定义过此用户,更何况用它来创建表了。
问题的原因
网上的解决方法大多是新生成一个‘skip-grants user‘@‘skip-grants host‘
用户,如此解决并没有说明此问题的原因。突发奇想,此表是我使用source
导入,现在我将其使用mysqldump
命令导出。再进行查找,果真发现了此用户
原来被/*!*/
包裹并非是注释,在mysql的source执行中会被当做元数据执行。如此,此问题原因是发生在定义触发器时所赋予的用户在我本地的mysql中不存在导致。而触发器恰好是在Insert执行后调用,所以会在插入后出现此问题。
问题的解决
删除掉原有的触发器,重新创建。
总结
这个问题非常具有迷惑性,之前我以为是表的定义者和用户不一样导致的,最终的结果却是触发器的原因。经此一乌龙发现mysql的表是没有定义者一说的,只有触发器才会出现此问题,为何这样说,让我们打开information_schema.TABLES
,你就能发现根本没有DEFINER
(定义者)这个字段,而TRIGGER
(触发器)存在。
select `DEFINER` from information_schema.`TABLES`;
select `DEFINER` from information_schema.`TRIGGERS`;
除了触发器,表内的主键、外键、索引也没有定义者一说,导出的SQL和information_schema数据库也能证明这一观点。
所以,出现这个问题就直接看看有没有定义的触发器吧!