mysql - 仅撤销对 MySQL 具有所有权限的用户的删除
问题描述
我有一个用户对 MySQL 8 中的特定数据库具有所有权限:
GRANT ALL PRIVILEGES ON `mydatabase`.* TO `foo`@`localhost`
我可以检查赠款SHOW GRANTS FOR 'foo'@'localhost';
并得到:
+-------------------------------------------------------------+
| Grants for foo@localhost |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO `foo`@`localhost` |
| GRANT ALL PRIVILEGES ON `mydatabase`.* TO `foo`@`localhost` |
+-------------------------------------------------------------+
现在我需要删除特定表上的 DELETE 授权,所以我尝试过:
REVOKE DELETE ON `mydatabase`.`mytable` FROM 'foo'@'localhost';
但我收到以下错误:
ERROR 1147 (42000): There is no such grant defined for user 'foo' on host 'localhost' on table 'mytable'
如何删除删除授权?我必须一一添加所有授权(它们是哪些?),然后删除删除授权?
解决方案
GRANT
将相应的行添加到权限表中。
REVOKE
从此表中删除具有指定权限的行,而不是添加具有删除权限的另一行。因此,您只能撤销表中存在的那些特权。恰恰。
您可以:
- 添加单独的权限列表,所有权限都包含在 ALL PRIVILEGES 中,但数据库级别的 DELETE 权限除外
- 对所有表添加 DELETE 权限,除了
mytable
- 删除 ALL PRIVILEGES 权限
这太复杂了。但正确。
或者,您可以简化解决方案,不使用特权系统(当然这不是好的做法),并使用根据触发器在编程级别禁止删除:
CREATE TRIGGER forbid_delete_for_user
BEFORE DELETE
ON mytable
FOR EACH ROW
BEGIN
IF LOCATE(USER(), 'foo@localhost,bar@localhost') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Deletion from 'mytable' not allowed for current user.';
END IF;
END
但是您必须记住,级联外键操作不会激活触发器。因此,用户仍然可以找到从该表中删除行的方法。
推荐阅读
- ios - 无法在 XCode 9 中的工作空间内的不同项目的视图控制器之间进行通信
- android - 活动上的后退按钮行为以在底部导航视图中进行分段
- python - 在 BigTiff 中用白色背景替换透明度
- android - 带有 TextView 的 GridLayout 创建额外的边距
- php - 应用未获批准,只想从公共页面获取帖子
- python - Python Tkinter 动态滚动条调整大小问题
- qt - 在 Qt 中进行布局
- jquery - jQuery bxslider ajax 加载
- javascript - 在移动设备上单击菜单图标时页面跳转到顶部
- eclipse-rcp - 将 eclipse e4 应用程序的窗口设置为具有基于屏幕大小