2017-08-09 33 views
1

我需要为我的数据库创建不同的用户,每个用户都可以访问特定表中的子列。我意识到要做到这一点,我需要分别访问列,因为如果我授予对整个表的访问权限,我不能撤消单个列权限。所以,我现在正在做的是给予的权限如下:在MySQL中单独授予所有列的权限

GRANT SELECT (`col_1`, `col_2`, ... , `col_100`), SHOW VIEW ON my_db.my_table TO 'my_user'@'%'; 

这是繁琐和杂乱,因为我有大量列的,也是不太实际,因为有可能会更改列列表在将来。有没有办法在没有列出名字的情况下授予每列的权限?然后,我可以撤销每个用户的个人用户。像这样的:

GRANT SELECT (SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA`='my_db' AND `TABLE_NAME`='my_table'), SHOW VIEW ON my_db.my_table TO 'my_user'@'%'; 

(但这给了我一个语法错误,所以它显然不是我所需要的)。有没有办法做到这一点?

+0

难道你不能使用像HeidiSQL这样的工具吗? –

+0

我需要提供SQL,以便其他用户可以重复使用,因此不幸的是GUI方法无法正常工作。 – Lisa

+0

HeidiSQL打印它在控制台中执行的每个命令。您可以将其复制并粘贴到文本编辑器中 - 然后找到并替换用户名。 –

回答

1

可以使用INFORMATION_SCHEMA,但不你尝试过的方式。相反,你应该先建立一个查询字符串。然后准备并执行它。

set @user = 'testuser'; 
set @host = 'localhost'; 
set @schema = 'test'; 
set @table = 'test_table'; 

set @columns = (
    select group_concat('`', column_name, '`') 
    from information_schema.columns 
    where table_schema = @schema 
     and table_name = @table 
); 

set @sql = 'GRANT SELECT({columns}) ON TABLE `{schema}`.`{table}` TO {user}@{host}'; 
set @sql = replace(@sql, '{columns}', @columns); 
set @sql = replace(@sql, '{schema}' , @schema); 
set @sql = replace(@sql, '{table}' , @table); 
set @sql = replace(@sql, '{user}' , quote(@user)); 
set @sql = replace(@sql, '{host}' , quote(@host)); 

prepare stmt from @sql; 
execute stmt; 

根据需要更改四个变量和查询。

1

如何授予不同的用户权限:

  • ALL特权─如我们前面看到的,这将允许MySQL用户 所有访问指定的数据库(或者如果没有选择数据库, 整个系统)
  • CREATE-使他们能够创建新表或数据库
  • 掇允许它们,将它们删除表或数据库
  • 删除 - 允许他们删除标签行莱插入 - 允许他们 插入行到表
  • 选择 - 允许他们使用选择命令 通过数据库读取
  • 更新 - 允许他们更新表中的行
  • GRANT选项 - 允许他们授予或删除其他用户的权限

为用户提供一个允许特定的用户,你可以使用这个框架:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’; 

我希望这会帮助你解决你的问题。永远不要忘记冲洗!

+0

我已经弄清了这部分,它在我的问题中的第一个代码片段。我的问题是找到一个更简单的方式来指定列名称,而不必将其列出。 – Lisa

+0

@Lisa你可以使用*而不是使用数据库的名字。这将使用户访问所有数据库。 – Noob

+0

这不适用于撤销列,它们必须单独授予才能单独撤销(除非出现我做错的事情)。 – Lisa