我需要为我的数据库创建不同的用户,每个用户都可以访问特定表中的列子集。我意识到要这样做,我需要单独授予对列的访问权限,因为如果我作为一个整体授予对表的访问权限,则无法撤消单个列权限。所以我现在正在做的是给予如下权限:
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 :(得分:1)
如何授予不同的用户权限:
要向特定用户提供权限,您可以使用此框架:
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';
从这里取得的例子: