我有一个数据库用户create_db_user
,我已授予具有特定前缀的数据库的所有权限:
GRANT ALL PRIVILEGES ON 'myprefix\_%'.* TO 'create_db_user'@'localhost' WITH GRANT OPTION;
我有另一个数据库用户帐户standard_user
,我授予SELECT, INSERT, UPDATE, DELETE
权限。
全局用户执行创建新数据库的SQL语句:myprefix_new_db
。它似乎没有任何问题(至少没有抛出异常)。但是,当它尝试将SIUD权限授予新创建的数据库的标准帐户时,将引发以下异常:
SQLSTATE[42000]: Syntax error or access violation: 1044 Access denied for user 'create_db_user'@'localhost' to database 'myprefix_new_db' @ #0
因此,至少从表面上看,我的全局用户帐户似乎有足够的权限来创建数据库,但还不足以与之交互。
确切的代码流如下:
$create_db_user->query(" SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO' ");
$create_db_user->execute();
$stmt = ' CREATE DATABASE IF NOT EXISTS ' . $myprefix_new_db . ' DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; ';
$stmt.= ' USE ' . $myprefix_new_db . ';';
$stmt.= $sql_stmt;
$create_db_user->query($stmt);
$create_db_user->execute();
// with or without grant option
$create_db_user->query(" GRANT ALL PRIVILEGES ON {$myprefix_new_db}.* TO 'create_db_user'@'localhost' WITH GRANT OPTION; ");
$create_db_user->execute();
$sql = " GRANT SELECT, INSERT, UPDATE, DELETE ON `{$myprefix_new_db}`.* TO 'standard_user'@'localhost' ";
$create_db_user->query($sql);
$create_db_user->execute();
我的问题是:我必须做些什么来确保我的create_db_user
帐户有足够的权限来执行动态创建的数据库?或者,我必须做些什么来确保创建数据库后,它包含在全局用户的范围内?
编辑:我有管理员级别的cPanel和WHM访问权限。
答案 0 :(得分:2)
每个数据库都有不同的单独权限规则。默认情况下,添加仅创建一些帐户的新数据库时。每次创建旧权限的新数据库都应该被提取,过滤,(可能被编辑)并复制到新数据库中。
如果新旧数据库在这些information_schema表中有所不同;
您可以复制这些内容并通过具有架构权限的帐户将其粘贴到新数据库中(但可能需要复制/过滤/编辑)
访问权限会有所不同。你能否验证这些表中是否包含所需的行?
如果动态创建大量数据库,以避免复制/过滤/编辑。创建一个基本默认数据库,并使用导入/导出脚本将其与变量一起克隆。
只是要强调:授予数据权限和授予用户权限需要您了解不同级别的访问权限。
另请注意:尝试创建新连接并在连接到新数据库的连接上运行GRANT。如果您正在使用某个预设平台,则可能会阻止从外部创建数据库和GRANTING(即使对于全局用户),这些语句可能会被静默忽略。
答案 1 :(得分:1)
根据我的理解,您正在尝试让create_db_user在数据库上授予自己所有权限以及with grant选项。我不确定是否应该允许。
您是否可以通过触发器从具有正确WITH GRANT权限的其他用户授予create_db_user权限?
祝你好运: - )答案 2 :(得分:-2)
您在授予权限后缺少刷新权限
Flush privileges;