撤消仅从对 MySQL 具有所有权限的用户删除
Revoke only delete from user with all privileges on 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` |
+-------------------------------------------------------------+
现在我需要删除对特定 table 的 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
将相应的行添加到权限 table.
REVOKE
从此 table 中删除具有指定权限的行,而不是通过删除权限添加另一行。因此,您只能撤销 table 中存在的权限。没错。
您可以:
- 添加单独的权限列表,所有权限都包含在 ALL PRIVILEGES 中,数据库级别的 DELETE 权限除外
- 对除
mytable
之外的所有 table 添加删除权限
- 删除所有权限权限
这太复杂了。但正确。
或者你可以简化解决方案,不使用特权系统(当然这不是好的做法),并使用以下触发器禁止在编程级别删除:
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
但您必须记住级联外键操作不会激活触发器。所以用户仍然可以找到从这个 table 中删除行的方法。
我有一个用户对 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` |
+-------------------------------------------------------------+
现在我需要删除对特定 table 的 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
将相应的行添加到权限 table.
REVOKE
从此 table 中删除具有指定权限的行,而不是通过删除权限添加另一行。因此,您只能撤销 table 中存在的权限。没错。
您可以:
- 添加单独的权限列表,所有权限都包含在 ALL PRIVILEGES 中,数据库级别的 DELETE 权限除外
- 对除
mytable
之外的所有 table 添加删除权限
- 删除所有权限权限
这太复杂了。但正确。
或者你可以简化解决方案,不使用特权系统(当然这不是好的做法),并使用以下触发器禁止在编程级别删除:
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
但您必须记住级联外键操作不会激活触发器。所以用户仍然可以找到从这个 table 中删除行的方法。