在MySQL中单独授予所有列的权限

时间:2017-08-09 16:53:32

标签: 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'@'%';

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

3 个答案:

答案 0 :(得分:1)

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

  • ALL PRIVILEGES-正如我们之前看到的,这将允许MySQL用户 所有访问指定数据库(如果没有选择数据库, 整个系统)
  • CREATE-允许他们创建新表或 数据库
  • DROP-允许他们删除表或数据库
  • DELETE-允许他们从表INSERT中删除行 - 允许它们 将行插入表格
  • SELECT-允许他们使用Select命令 阅读数据库
  • 更新 - 允许他们更新表格行
  • GRANT OPTION-允许他们授予或删除其他用户的权限

要向特定用户提供权限,您可以使用此框架:

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

我希望这可以帮助您解决问题。永远不要忘记冲洗!!!

答案 1 :(得分: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;

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

答案 2 :(得分:0)

您可以使用以下代码向用户授予对各列的权限:

GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';

从这里取得的例子:

http://dev.mysql.com/doc/refman/5.1/en/grant.html