是否有一种简单的方法可以创建用户并向除特定数据库之外的所有数据库授予所有特权?
我已经尝试过了
CREATE USER 'demo'@'%' IDENTIFIED BY 'QbSv9qUj2EJ8mxm2';
GRANT ALL PRIVILEGES ON *.* TO 'demo'@'%';
REVOKE ALL ON id8694160_sqless.* FROM 'demo'@'%'; -- this is the DB I don't want the user to have access to
SHOW GRANTS FOR 'demo'@'%';
但是出现以下错误:
Error Code: 1141. There is no such grant defined for user 'demo' on host '%'
这有可能吗?
答案 0 :(得分:0)
全局特权使用*。*授予priv_level。全局特权包括管理数据库和管理用户帐户的特权,以及所有表,函数和过程的特权。 全局特权存储在mysql.user表中。
数据库特权使用db_name。*授予priv_level,或者仅使用*来使用默认数据库来授予。数据库特权包括创建表和函数的特权,以及数据库中所有表,函数和过程的特权。 数据库特权存储在mysql.db表中。
这意味着您用GRANT ALL PRIVILEGES ON *.* TO 'demo'@'%';
授予的特权由mysql.user表中的一行表示。从这些全局特权中仅撤销一个数据库的特权意味着从mysql.user表中删除该全局特权,并为mysql.db表中除id8694160_sqless数据库之外的每个数据库添加一个数据库特权。
我非常确定REVOKE
语句不会执行此操作,但是您可以手动为除请求这样的数据库之外的所有数据库授予特权:
INSERT INTO mysql.db
SELECT '%',schema_name,'demo','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'
FROM information_schema.schemata
WHERE NOT schema_name = 'mysql'
AND NOT schema_name = 'information_schema'
AND NOT schema_name = 'performance_schema'
AND NOT schema_name = 'id8694160_sqless';
FLUSH PRIVILEGES;