Phpmyadmin导出视图,不带数据库名称或算法
使用phpmyadmin导出sql转储时,会创建如下视图表:Phpmyadmin导出视图,不带数据库名称或算法,php,mysql,phpmyadmin,Php,Mysql,Phpmyadmin,使用phpmyadmin导出sql转储时,会创建如下视图表: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `database`.`table` etc.. 每次我都必须手动编辑sql转储以删除根用户和数据库名称 它创建了一个具有DEFINER={user | CURRENT_user}和完全限定表名的视图,因为在导出视图期间,PHPMyADMIN执行SHOW CREATE VI
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER
VIEW `database`.`table` etc..
每次我都必须手动编辑sql转储以删除
根用户和数据库
名称 它创建了一个具有DEFINER={user | CURRENT_user}和完全限定表名的视图,因为在导出视图期间,PHPMyADMIN执行SHOW CREATE VIEWdatabase_name
视图_name
;它返回所有这些值,因为它是“显示创建视图结果”的一部分。
请参阅。要从结果中删除数据库名称,应设置默认数据库名称,例如-
USE db_name;
SHOW CREATE VIEW view_name;
您将得到类似的结果(没有数据库名称的DDL)-
定义者是一个视图属性,我没有看到任何选项可以从SHOW CREATE view结果中删除此属性。因此,您需要解析文本并手动修改它
此外,您还可以尝试在中使用带有“排除定义器和SQL安全子句”选项的“生成架构脚本”或“备份”工具。它将帮助您通过以下几个步骤生成所需的脚本:
- 在数据库资源管理器中选择“查看”
- 打开弹出菜单并单击“生成架构脚本…”命令
- 找到“排除定义器和SQL安全子句”选项并选中它
- 按“生成”按钮生成并打开SQL文本
使用phpmyadmin导出sql转储时,会创建如下视图表:
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER
VIEW `database`.`table` etc..
我已经用mysqldump
进行了检查,它的功能完全相同。mysqldump和PHPMyAdmin似乎都执行showcreate,这导致在CREATE语句中有一个安全定义符。我看不出有什么办法可以“关掉它”
每次我都必须手动编辑sql转储以删除根用户和数据库名称
这是我可以帮忙的地方。手动编辑SQL文件是一件非常糟糕的事情,而且很容易出错。我以前遇到过这样的问题,导出用户在我想要导入的平台上不存在。我唯一需要编辑的是CREATE和VIEW之间的所有内容
现在,既然您已经用php
标记了您的问题,我想您知道如何从命令行使用它。以下脚本将用空字符串替换所有不必要的值:
<?php
$string = 'CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER
VIEW `database`.`table` AS';
$string = preg_replace(
'/CREATE .*(TABLE|VIEW) `[^`]+`\.(`[^`]+`)/s',
'CREATE $1 $2',
$string
);
var_dump( $string );
也许我不明白。。。但这对我来说一直很有效。没有对数据库名称的引用,所有定义都被删除,因此从它生成的文件中恢复非常容易:
mysqldump -uUSERNAME -pPASSWORD database | sed -e 's/DEFINER=[^*]*\*/\*/' > backup.sql
要恢复:
mysql -uUSERNAME -pPASSWORD database < backup.sql
mysql-uUSERNAME-pPASSWORD数据库
只要您要恢复的数据库存在(空或不存在),它就可以正常工作。使用mysqldump导出后,我使用这个简单的脚本来删除它
<?php
$file = file_get_contents($argv[1]);
$position = strpos($file, 'Final view structure for view');
if (false !== $position) {
echo substr($file, 0, $position);
}
else {
die('not found');
}
在linux中,删除文本文件中不需要的信息非常简单。鉴于CREATE VIEW
创建了如下内容:
创建算法=未定义的定义者=用户
@主机
SQL安全定义者视图
视图名
等
您可以使用以下sed:
sed -e 's/ALGORITHM.*DEFINER VIEW/VIEW/' backup-mysqldump.sql > backup.sql
您还可以在单个命令中使用withmysqldump
,并使用管道:
mysqldump -uUSERNAME -pPASSWORD database |sed -e 's/ALGORITHM.*DEFINER VIEW/VIEW/' > backup.sql
虽然只花了8年时间,但phpmyadmin现在包含了一个防止此问题的选项:- 排除当前用户的定义
这将出现在“创建视图”部分下,选择此选项,您将获得正常工作的摘录。这是否可能?我是唯一一个有这个问题的人吗?为什么你必须手动删除它们?当您尝试将数据导入到phpMyAdmin时,是否会导致任何问题?是的,因为此用户在其他环境中不存在。数据库名称有时也会更改。所有其他表在没有任何这些的情况下导出似乎很奇怪。这在大多数共享系统上都会失败,在这些系统中,用户没有运行安全定义程序的权限,而简单的创建视图就可以正常工作。