授予对一个数据库的文件权限

41

我想允许john mysql用户使用LOAD DATA命令。所以我以root身份登录mysql终端,并发出了以下语句:

grant file on johndatabase.* to 'john'@'localhost';

但我收到了以下错误:

ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
如果我用*.*替换johndatabase.*,那么一切都能正常工作。但是*.*不是意味着所有数据库吗?我想限制john mysql用户只能访问johndatabase。
3个回答

69

你无法仅对单个数据库授予FILE权限。这在逻辑上毫无意义。请考虑文档中的说明:

FILE权限允许您使用LOAD DATA INFILE和SELECT ... INTO OUTFILE语句以及LOAD_FILE()函数在服务器主机上读取和写入文件。具有FILE权限的用户可以阅读任何一个世界可读或MySQL服务器可读的服务器主机上的文件。(这意味着用户可以阅读任何数据库目录中的文件,因为服务器可以访问其中任何文件。)

因此,FILE权限是一个全局权限。它影响服务器上的所有文件,并仅允许访问全局命令(例如LOAD DATA INFILE等),而不针对任何特定数据库。唯一授予FILE权限的方法是在所有数据库上使用以下语法:

GRANT FILE ON *.* TO 'john'@'localhost';

你在哪里使用GRANT FILE查询语法?我在SO上没有看到任何示例代码来解释如何使用它,因为我需要授予文件以供输出使用。然后,在输出完成后,我需要拒绝文件。 - Sir
1
澄清一下,希望将“FILE”特权限制在一个数据库中在逻辑上是有意义的。但这会产生虚假的安全感。只有最受信任的用户应该获得它。 - Bob Stein

0
你应该像下面展示的那样,在所有数据库的所有表上授予FILE权限:*.*
GRANT FILE ON *.* TO 'user';

实际上,文档 下面说道:
因为任何静态全局权限都被视为对所有数据库的权限,...
而且,你不能仅在一个表(例如,person)上给予 FILE 权限,而在所有数据库(*.person)中如下所示,因为会出现错误:
GRANT FILE ON *.person TO 'user';

所以,我们需要在所有数据库的所有表上授予类似于静态全局权限的权限,例如文件权限进程权限复制从属权限等等,如下所示。否则会出现错误。
GRANT [STATIC_GLOBAL_PRIVILEGES] ON *.* TO <USER>;

0

通过FILE权限,您可以授予用户访问mysql服务器可以访问的文件系统的权限。因此,将其限制为特定数据库是无用的,因为用户将能够在文件系统级别上访问所有数据库。这就是为什么它只能设置为*.*


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