MariaDB中撤销权限层级:能否同步撤销用户及其授权用户的权限?
在MariaDB中级联撤销用户权限的解决方案
首先直接给结论:MariaDB不支持REVOKE ... CASCADE这种直接级联撤销的语法,这就是你执行语句报错的核心原因。不过我们可以通过两步操作,实现“撤销指定用户自身权限+撤销该用户授予他人的对应权限”的需求,下面详细说明:
1. 先撤销目标用户自身的权限
这一步很直接,去掉你语句里不被支持的CASCADE子句即可:
REVOKE SELECT ON mysql.sometable FROM 'user'@'%';
这条语句会收回'user'@'%'在mysql.sometable上的SELECT权限。
2. 撤销该用户授予其他用户的对应权限
MariaDB不会自动帮你处理这部分关联权限,需要先找出所有被'user'@'%'授予过该权限的用户,再逐个执行撤销操作。
针对表级权限(比如你例子中的SELECT)
查询mysql.tables_priv表获取相关用户列表:
SELECT grantee FROM mysql.tables_priv WHERE grantor = 'user'@'%' -- 注意这里要和目标用户的格式完全一致 AND table_schema = 'mysql' AND table_name = 'sometable' AND priv_type = 'SELECT';
查询结果会列出所有被'user'@'%'授予过该表SELECT权限的用户(格式类似'another_user'@'192.168.1.%')。
然后对每个结果中的用户执行撤销:
REVOKE SELECT ON mysql.sometable FROM 'another_user'@'192.168.1.%';
针对不同权限级别
如果是数据库级权限,需要查询mysql.db表;全局级权限则查询mysql.user表,调整查询条件即可。比如数据库级权限的查询示例:
SELECT CONCAT('''', user, '''@''', host, '''') AS grantee FROM mysql.db WHERE grantor = 'user'@'%' AND db = 'your_database' AND select_priv = 'Y'; -- 对应你要撤销的权限,比如select_priv、insert_priv等
批量处理(可选)
如果需要处理大量用户,可以写一个简单的存储过程自动化执行,示例如下:
DELIMITER // CREATE PROCEDURE RevokeGrantedPermissions( IN p_grantor VARCHAR(100), IN p_privilege VARCHAR(50), IN p_db VARCHAR(100), IN p_table VARCHAR(100) ) BEGIN DECLARE done INT DEFAULT FALSE; DECLARE v_grantee VARCHAR(100); DECLARE cur CURSOR FOR SELECT grantee FROM mysql.tables_priv WHERE grantor = p_grantor AND table_schema = p_db AND table_name = p_table AND priv_type = p_privilege; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO v_grantee; IF done THEN LEAVE read_loop; END IF; SET @sql = CONCAT('REVOKE ', p_privilege, ' ON ', p_db, '.', p_table, ' FROM ', v_grantee, ';'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END LOOP; CLOSE cur; END // DELIMITER ;
调用这个存储过程即可批量处理:
CALL RevokeGrantedPermissions('user@%', 'SELECT', 'mysql', 'sometable');
补充说明
- 执行这些操作需要你拥有
GRANT OPTION权限以及对应的撤销权限。 - 操作完成后,可以用
SHOW GRANTS FOR 'user'@'%';验证目标用户的权限是否被收回,也可以查询对应的权限表验证其他用户的权限是否被撤销。
内容的提问来源于stack exchange,提问作者fotpap96
相关产品推荐
相关产品推荐

