我正在使用脚本来创建Mysql数据库和表.这些脚本包含以下授权部分:
GRANT SELECT ON my_database.* TO my_user@"%" IDENTIFIED BY 'my_password';
REVOKE ALL PRIVILEGES ON my_database.* FROM my_user@"%";
GRANT SELECT, UPDATE ON my_database.* TO my_user@"%" IDENTIFIED BY 'my_password';
Run Code Online (Sandbox Code Playgroud)
最初,我只使用了第三行,但遇到了以下问题:每当我从用户删除权限Q并重新运行该脚本时,用户仍然在数据库中拥有该权限.所以我在授权行之前添加了撤销行.
然后我遇到了以下问题:每当我在'新'Mysql安装上运行脚本时,撤销失败,因为用户尚未存在.所以我在撤销之前添加了一个"虚拟"补助金.
问题:有没有更好的方法来实现这一目标?我的"真实"脚本包含大量用户和大量数据库,并且难以阅读,因为我想要分配的每组权限需要三行.我只想用一行.
编辑(根据答案和评论的反馈):
我正在寻找最简单的说法
SET PRIVILEGES SELECT, UPDATE
ON my_database.*
TO my_user@"%"
IDENTIFIED BY 'my_password';
Run Code Online (Sandbox Code Playgroud)
my_user可能在哪里
如有必要,您可以使用过程创建新用户,并为数据库授予权限.我使用了预处理语句和GRANT语句.MySQL 5.5中的预处理语句支持GRANT,如果使用的是较低版本,则可以将GRANT命令重写为INSERT INTO.
使用测试;
DELIMITER $$
CREATE PROCEDURE procedure_user(
IN host_name VARCHAR(60), IN user_name VARCHAR(60),
IN db_name VARCHAR(255),
IN db_privs VARCHAR(255))
BEGIN
SELECT 1 INTO @exist FROM mysql.user WHERE user = user_name AND host = host_name;
-- Create new user, generate command like this: CREATE USER 'user1'@'%';;
IF @exist IS NULL THEN
SET @sql = CONCAT('CREATE USER ''', user_name, '''@''', host_name, '''');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
-- Generate command like this: GRANT INSERT, UPDATE ON database1.* TO 'user1'@'%';
SET @sql = CONCAT('GRANT ', db_privs, ' ON ', db_name, '.* TO ''', user_name, '''@''', host_name, '''');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
使用示例:
-- First command will create new user user1@% and will grant SELECT, INSERT, UPDATE privileges to database1.
CALL procedure_user('%', 'user1', 'database1', 'SELECT, INSERT, UPDATE');
-- Second command just will grant SELECT, INSERT, UPDATE privileges to database2 to that user.
CALL procedure_user('%', 'user1', 'database2', 'SELECT, INSERT, UPDATE');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4825 次 |
| 最近记录: |