Эквивалент MySQL DROP DATABASE без корневого доступа или привилегий DROP - PullRequest
1 голос
/ 20 декабря 2009

Я координирую ряд проектов по разработке PHP. Я настроил рабочий процесс, в котором все разработчики работают с одним хранилищем Subversion. Когда они будут готовы взглянуть на свое приложение на промежуточных серверах, загрузите дамп базы данных MySQL и создайте тег.

Я настроил сценарий оболочки, который автоматически развернет код PHP в DocumentRoot и настроит соответствующие разрешения. Теперь мне нужно сценарий загрузки снимка базы данных.

При первой настройке нового приложения я создаю базу данных и учетную запись пользователя следующим образом:

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

Теперь, когда разработчики проверяют новую версию дампа MySQL в Subversion, мне нужно удалить старую БД и восстановить новый снимок. В настоящее время я использую следующий рабочий процесс.

1.) Войдите в MySQL как root

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 ]

1 голос
/ 20 декабря 2009

У меня нет времени, чтобы проверить это, но попробуйте предоставить пользователям привилегию CREATE для всего MySQL, тогда у пользователя, создавшего каждую БД, должны быть права на удаление того, что они создали, если вы не можете предоставить им разрешения на удаление для этой БД

1 голос
/ 20 декабря 2009

Вы можете использовать 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; 
1 голос
/ 20 декабря 2009

Прежде всего, суперпользователь или нет, здесь не имеет прямого отношения. У mysql часто есть пользователь root, но это не обязательно связано с именем пользователя root.

Похоже, ваш вопрос «как мне сделать X как пользователя mysql и не дать этому пользователю иметь разрешение на выполнение X», что приводит к ответу «вы не можете». Похоже, в вашем вопросе должно быть что-то еще. Почему вы хотите использовать одного и того же пользователя для всего?

Каким-то образом вам нужно иметь больше прав для настройки среды. Это можно сделать имея отдельного пользователя mysql, или отдельный сервер mysql, или временно отключив сервер mysql и запустив отдельный экземпляр его с --skip-grant-tables на время установки.

1 голос
/ 20 декабря 2009

Ваши варианты:

  1. Запустите сценарии от имени пользователя root
  2. Предоставьте соответствующие разрешения пользователю (ям) базы данных, если возможно, с помощью роли.
  3. Предоставить пользователю возможность предоставлять дамп для скрипта, который запускается от имени пользователя root

База данных не позволит вам обойти контроль доступа.

0 голосов
/ 20 декабря 2009

Почему бы не сделать это?

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" - это разные вещи.

0 голосов
/ 20 декабря 2009

Вы можете предоставить глобальные разрешения пользователю. Это не самый безопасный способ, но он защищает пароль пользователя root, и если это система, в которой удаление базы данных является обычной операцией, то целостность данных выглядит менее важной.

Вы можете использовать флаг --add-drop-database в mysqldump, чтобы удалить базу данных перед импортом дампа:

--add-drop-database Add a 'DROP DATABASE' before each create.
0 голосов
/ 20 декабря 2009

Возможно, вы сможете немного обмануть.

Если вы можете организовать его так, чтобы скрипт мог запускаться от имени пользователя root или пользователя mysql, вы можете заставить скрипт установить базу данных с надлежащими разрешениями базы данных и «пустой» настройкой схемы.

отключение mysql

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

запуск mysql

Итак, в чистой копии базы данных есть созданная база данных и операторы предоставления, но нет данных.

-daniel

...