MySQL没有实现public关键词。所以,要把一个表(如表table1)的select权限授予所有用户,需要自己遍历所有用户。表Table1的权限,可以通过:
select * from mysql.tables_priv where Table_name = 'table1';
查看。所以,你可以直接在这张表上动手,也可以把所有用户读至游标,遍历所有用户,并用grant语句分别授权:
以下为演示代码:
delimiter $$
create procedure grant_select_table1_to_pubic()
begin
-- 定义变量,用于储存用户名:
declare v_user char(32);
-- 定义结束标志
DECLARE done INT DEFAULT FALSE;
-- 定义游标,这里只演示普通用户:
declare cur_user cursor for
select user from mysql.user
where User <> 'root' and user not like '%.%' and user <>'' ;
-- 定义 NOT FOUND类异常的HANDLER:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打开游标
open cur_user ;
-- 取游标的一行数据到变量(取一个用户名),并推进游标
fetch cur_user into v_user ;
-- 每取一个user,构造一条授权语句,然后执行这条语句
-- (因为grant语句不接受变量,它会把变量名当成一个用户名,所以只能构造整条语句)
while not done do
set @query = CONCAT('GRANT SELECT ON table1 to ',v_user);
prepare statement from @query;
execute statement;
deallocate prepare statement;
-- 取下一个用户
fetch cur_user into v_user;
end while;
close cur_user;
end$$;
-- 调用过程,授权给所用用户:
call grant_select_table1_to_pubic();
-- 验证表“table1”的SELECT权限(果然有给所有用户授权哦)
select * from mysql.tables_priv where Table_name = 'table1';
如果用户很少的话,不如直接写grant语句。万一用户较多,可考虑以上方案。
另外,你也可以考虑使用角色:
create role if not exists 'SELECT_table1'; -- 创建角色
grant SELECT on table1 to 'SELECT_table1'; -- 授予该角色select table1的权限
grant 'SELECT_table1' to 用户1,用户2,....; -- 把角色的权限授予用户......,比写一堆grant语句省事
可惜的是,角色需要MySQL 8.0以上版本才支持!!!