在MySQL中单独授予所有列的权限
问题描述:
我需要为我的数据库创建不同的用户,每个用户都可以访问特定表中的子列。我意识到要做到这一点,我需要分别访问列,因为如果我授予对整个表的访问权限,我不能撤消单个列权限。所以,我现在正在做的是给予的权限如下:在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'@'%';
(但这给了我一个语法错误,所以它显然不是我所需要的)。有没有办法做到这一点?
答
可以使用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;
根据需要更改四个变量和查询。
答
如何授予不同的用户权限:
- ALL特权─如我们前面看到的,这将允许MySQL用户 所有访问指定的数据库(或者如果没有选择数据库, 整个系统)
- CREATE-使他们能够创建新表或数据库
- 掇允许它们,将它们删除表或数据库
- 删除 - 允许他们删除标签行莱插入 - 允许他们 插入行到表
- 选择 - 允许他们使用选择命令 通过数据库读取
- 更新 - 允许他们更新表中的行
- GRANT选项 - 允许他们授予或删除其他用户的权限
为用户提供一个允许特定的用户,你可以使用这个框架:
GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;
我希望这会帮助你解决你的问题。永远不要忘记冲洗!
答
可以授予的权利,单独的列用户,使用此代码:从这里取
GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';
例子:
难道你不能使用像HeidiSQL这样的工具吗? –
我需要提供SQL,以便其他用户可以重复使用,因此不幸的是GUI方法无法正常工作。 – Lisa
HeidiSQL打印它在控制台中执行的每个命令。您可以将其复制并粘贴到文本编辑器中 - 然后找到并替换用户名。 –