MySQL DROP DATABASE相当于没有root访问权限或DROP权限

时间:2009-12-20 19:26:20

标签: mysql svn workflow

我正在协调许多PHP开发项目。我已经设置了一个工作流程,开发人员都可以使用一个Subversion存储库。当他们准备好在临时服务器上查看他们的应用程序时,上传一个MySQL数据库转储并创建一个标记。

我已经配置了一个shell脚本,它将自动将PHP代码部署到DocumentRoot并配置适当的权限。我现在需要编写数据库快照的加载脚本。

当我第一次配置新应用程序时,我创建了一个数据库和用户帐户,如下所示:

CREATE DATABASE foodb;
GRANT ALL ON foodb.* TO user1@localhost IDENTIFIED BY 'password';

现在,当开发人员将新版本的MySQL转储检查到Subversion时,我需要删除旧数据库并恢复新快照。我目前正在使用以下工作流程。

1。)以root身份登录MySQL

DROP DATABASE foodb;
CREATE DATABASE foodb;
GRANT ALL ON foodb.* TO user1@localhost IDENTIFIED BY 'password';

2.)登录MySQL“user1”

mysql -h localhost -u user1 --password="drumitFed" foodb << new-db-dump-from-subversion.sql

我想结合上面的步骤1和2。我想它会看起来像这样。代码不仅应该删除表,还应该删除视图,索引和存储过程。

请注意,它必须以数据库用户身份运行,而不是超级用户,并且数据库用户没有DROP DATABASE或CREATE DATABASE权限。

mysql -h localhost -u user1 --password="password" foodb << delete-all-tables-and-views.sql
mysql -h localhost -u user1 --password="password" foodb << new-db-dump-from-subversion.sql

7 个答案:

答案 0 :(得分:1)

您的选择是:

  1. 以root身份运行脚本
  2. 尽可能通过角色为数据库用户授予适当的权限。
  3. 公开用户为脚本提供转储的功能,该脚本以root身份运行
  4. 数据库不允许您绕过访问控制。

答案 1 :(得分:1)

首先,超级用户与否在这里没有直接关系。 mysql通常有一个“root”用户,但不必与root登录相关联。

您的问题似乎是“如何将X作为mysql用户进行操作,并使该用户不必拥有执行X的权限”,从而导致“您无法”回答。所以你的问题似乎还有别的东西。为什么要将相同的用户用于所有内容?

不知何故,您需要拥有更大的权限才能设置环境。这可以做到 通过拥有一个单独的mysql用户,或一个单独的mysql服务器,或者通过临时关闭mysql服务器并在设置期间使用--skip-grant-tables运行它的单独实例。

答案 2 :(得分:1)

我没有时间对此进行测试,但尝试向用户授予MySQL范围内的CREATE权限,然后创建每个数据库的用户应该有权删除他们创建的内容,如果不是,则可以授予他们对该数据库的删除权限?

答案 3 :(得分:1)

您可以使用information_schema生成执行该作业的SQL查询。我对你正在使用的脚本解决方案了解不多,所以我不能为此提出任何建议,但是这里有一个示例SQL脚本,可以完成MySQL内部的所有操作:

DELIMITER go

DROP PROCEDURE IF EXISTS p_drop_all_tables;
go

CREATE PROCEDURE p_drop_all_tables()
BEGIN
    DECLARE v_table_type VARCHAR(64);
    DECLARE v_table_name VARCHAR(64);
    DECLARE v_not_found TINYINT(1) DEFAULT FALSE;
    DECLARE csr_tables CURSOR FOR
        SELECT  CASE table_type
                    WHEN 'BASE TABLE' THEN 'TABLE'
                    ELSE table_type
                END table_type
        ,       table_name
        FROM    information_schema.TABLES
        WHERE   table_schema = SCHEMA()
        AND     table_type IN ('BASE TABLE', 'VIEW')
        ;
    DECLARE CONTINUE HANDLER FOR NOT FOUND 
        SET v_not_found := TRUE;

    SET @@foreign_key_checks := OFF;
    OPEN csr_tables;
    table_loop: LOOP

        FETCH   csr_tables 
        INTO    v_table_type
        ,       v_table_name
        ;
        IF v_not_found THEN
            CLOSE csr_tables;
            LEAVE table_loop;
        END IF;

        SET @stmt := CONCAT(
            'DROP '
        ,   v_table_type
        ,   ' `', v_table_name, '`'
        );
        PREPARE stmt FROM @stmt;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

    END LOOP;
    SET @@foreign_key_checks := ON;
END;
go

CALL p_drop_all_tables();
go

DROP PROCEDURE p_drop_all_tables;
go

DELIMITER; 

答案 4 :(得分:0)

你可能会有所作为。

如果您可以安排它以便脚本可以作为root用户或mysql用户运行,则可以让脚本使用正确的数据库权限和“空白”架构设置来安装数据库。

关闭mysql

copy -rp ... / clean / * / var / lib / mysql /

启动mysql

因此,数据库的干净副本具有已创建的数据库和grant语句,但没有数据。

-daniel

答案 5 :(得分:0)

您可以向用户授予全局权限。这不是最安全的,但它确实保护了root用户密码,如果这是一个丢弃数据库是一个常见操作的系统,那么数据完整性似乎就不那么重要了。

您可以在导入转储之前使用mysqldump中的--add-drop-database标志删除数据库:

--add-drop-database Add a 'DROP DATABASE' before each create.

答案 6 :(得分:0)

为什么不这样做?

mysql -h localhost -u root --password="xxx" foodb << delete-all-tables-and-views.sql
mysql -h localhost -u user1 --password="yyy" foodb << new-db-dump-from-subversion.sql

脚本本身不需要以root身份运行。 MySQL“root”和系统的“root”是不同的东西。