Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Phpmyadmin导出视图,不带数据库名称或算法_Php_Mysql_Phpmyadmin - Fatal编程技术网

Phpmyadmin导出视图,不带数据库名称或算法

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

使用phpmyadmin导出sql转储时,会创建如下视图表:

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER 
VIEW `database`.`table` etc..

每次我都必须手动编辑sql转储以删除
根用户和
数据库
名称

它创建了一个具有DEFINER={user | CURRENT_user}和完全限定表名的视图,因为在导出视图期间,PHPMyADMIN执行SHOW CREATE VIEW
database_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
您还可以在单个命令中使用with
mysqldump
,并使用管道:

mysqldump -uUSERNAME -pPASSWORD database |sed -e 's/ALGORITHM.*DEFINER VIEW/VIEW/' > backup.sql

虽然只花了8年时间,但phpmyadmin现在包含了一个防止此问题的选项:-

排除当前用户的定义


这将出现在“创建视图”部分下,选择此选项,您将获得正常工作的摘录。

这是否可能?我是唯一一个有这个问题的人吗?为什么你必须手动删除它们?当您尝试将数据导入到phpMyAdmin时,是否会导致任何问题?是的,因为此用户在其他环境中不存在。数据库名称有时也会更改。所有其他表在没有任何这些的情况下导出似乎很奇怪。这在大多数共享系统上都会失败,在这些系统中,用户没有运行安全定义程序的权限,而简单的创建视图就可以正常工作。