我正在协调许多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
答案 0 :(得分:1)
您的选择是:
数据库不允许您绕过访问控制。
答案 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”是不同的东西。