You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:49:28