mysqldump会在触发器中使用数据库名称进行全限定。

5
我正在尝试使用mysqldump导出一个需要使用不同数据库名称导入的数据库。查看mysqldump生成的SQL,似乎触发器是唯一使用源数据库名称完全限定的对象名称,因此破坏了我的需求。是否有办法指示mysqldump不要完全限定任何对象名称,包括触发器?
3个回答

5
我曾经遇到同样的问题,并找到了解决方案。我使用MySQL Workbench设计我的数据库,并在其中创建了一些触发器。它们所有的语法都是CREATE TRIGGER trigger_name,除了一个例外:CREATE TRIGGER dbname.trigger_name(这只是我的错误)。Mysqldump输出以相同的方式包含了所有触发器:只有一个带有数据库名称。
Mysqldump使用您原始的CREATE TRIGGER指令,您可以通过SHOW CREATE TRIGGER查看它们。如果您定义了一个带有数据库名称的触发器,请用一个不带dbname的触发器替换它(删除并创建)。

我不会验证这个(已经过去两年了,而且在可预见的未来我也不需要它),但这听起来是一个可信和实用的解决方案,所以我将其标记为答案!谢谢分享。 - Stephen Swensen
哈,我看到@emre实际上在一年前建议了这个解决方案,但我否决了他的建议。尽管如此,他的是一个怀疑,而你的是一个坚持,所以我会把标记答案留给你。当然,如果有人发现相反的证据,我们将考虑那时的情况。目前,我认为你的建议很可能会帮助其他人。 - Stephen Swensen
好的,我刚刚测试了一下,因为我也遇到了同样的问题。如果重要的话,我的MySQL服务器版本是5.5.29-0ubuntu0.12.04.1。 - ducin

1
很可能是在创建触发器时添加了数据库名称。尝试在不包含数据库名称的情况下更新您的触发器。

这已经有一段时间了,我必须处理这个问题,但我非常确定问题不是由于使用完全限定的数据库名称创建触发器:无论我如何创建它们,mysqldump 都会生成带有数据库名称完全限定的触发器创建脚本。 - Stephen Swensen

-1

这不是一个理想的解决方案,但是通过以下方式将输出传递已经让触发器中的数据库名称消失了。

mysqldump ... opts ... | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接