如何编写好的Mysql授予脚本

mic*_*667 6 mysql grant

我正在使用脚本来创建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可能在哪里

  • 已存在(但可能是新的)
  • 目前有特权扩展我希望他拥有的
  • 拥有其他数据库的权限,这些数据库必须保持不受影响

Dev*_*art 5

如有必要,您可以使用过程创建新用户,并为数据库授予权限.我使用了预处理语句和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)

  • 您可以`SELECT 1 INTO @exist FROM mysql.user ...`而不是`SELECT COUNT(*)INTO @exist FROM mysql.user ...`以避免不必要的count()调用. (2认同)