我有一个包含250个以上表的Mysql DB,我需要阻止单个用户在其中一个表上的删除权限。
我们已经尝试过使用Grant,但是该数据库具有删除权限,因此单个表的Grant查询不会生效,我仍然可以从该表中删除行。我做到了:
GRANT SELECT, INSERT, UPDATE ON db.table TO 'user'@'host';
全球许可:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER ON `db`.* TO 'user'@'host'
是否有一种方法可以覆盖单个表的权限,或者我们必须删除全局权限并为每个表中的用户设置权限? 也许可以通过某种方式为所有(*)设置全局许可(*除外),以便第二次授予生效?
还尝试了@ kiks73帖子:
REVOKE DELETE ON db.table FROM 'user'@'host';
获取:
ERROR 1147 (42000): There is no such grant defined for user 'user' on host 'host' on table 'table'
但是为此用户设置了全局权限,包括该表的删除权限。
谢谢
答案 0 :(得分:2)
我认为您需要使用REVOKE语句,因为您必须删除先前授予的权限:
REVOKE DELETE ON db.table FROM 'user'@'host';
更新
请参阅此Super User Q&A,如果在该表上没有该用户的特定授权要撤销,则应尝试删除GRANT ALL ON db.*
并将授权分配给每个用户单个表,但特定表上的特定用户除外,该表仅被授予插入和更新的权限。
如果有250个表,则可以创建一个脚本,结合此SQL来获取用户创建的表的列表:
SELECT * from information_schema.tables
WHERE table_schema not in ('information_schema', 'mysql', 'performance_schema')
和用户:
SELECT User FROM mysql.user;
使用所需的授权创建SQL字符串。