mysql `GRANT FILE ON`仅一个数据库

wvyml7n5  于 12个月前  发布在  Mysql
关注(0)|答案(3)|浏览(123)

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

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

字符串
但我得到了以下错误:
错误1221(HY000):DB GRANT和GLOBAL PRIVILEGES的用法不正确
如果我用*.*替换johndatabase.*,那么一切都正常。但是*.*不是意味着所有数据库吗?我想把john mysql用户限制为johndatabase。

p8h8hvxi

p8h8hvxi1#

你不能只在一个数据库上授予FILE权限。这在逻辑上没有任何意义。考虑一下文档是怎么说的:
FILE权限允许您使用LOAD DATA INFILE和SELECT ... INTO OUTFILE语句以及LOAD_FILE()函数读取和写入服务器主机上的文件。具有FILE权限的用户可以读取服务器主机上的任何文件,这些文件可以是全局可读的,也可以是MySQL服务器可读的。(这意味着用户可以读取任何数据库目录中的任何文件,因为服务器可以访问任何这些文件。
因此,FILE权限是一个 global 权限。它影响服务器上的所有文件,并且只允许访问全局命令(例如LOAD DATA INFILE等),而不限于任何数据库。授予FILE权限的唯一方法是在所有数据库上,使用以下语法:

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

字符串

j2qf4p5b

j2qf4p5b2#

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

5fjcxozz

5fjcxozz3#

您应该对所有数据库(*.*)中的所有表授予FILE,如下所示:

GRANT FILE ON *.* TO 'user';

字符串
实际上,医生在下面说:
因为任何静态全局特权都被认为是所有数据库的特权,...
而且,您不能给予FILE特权,因为存在错误,如下所示,在所有数据库(*.person)中仅对一个表(例如person)授予FILE特权:

GRANT FILE ON *.person TO 'user';


因此,我们需要在所有数据库(*.*)中的所有表上授予静态全局权限,如FILE,PROCESS,REPLICATION SLAVE等,如下图所示,否则会出现错误:

GRANT [STATIC_GLOBAL_PRIVILEGES] ON *.* TO <USER>;

相关问题