是否可以仅在具有 MySQL 的临时表上授予插入、更新和删除权限?
Is it possible to grant insert, update and delete privileges only on temporary tables with MySQL?
我有一个用户在从属数据库上只有 SELECT
和 CREATE TEMPORARY TABLES
权限,以确保从属数据库不会在复制之外更改表,但是无法 INSERT
(以及 UPDATE
和 DELETE
)在任何创建的临时表上,CREATE TEMPORARY TABLES
权限是相当无用的。
是否可以授予这些权限但仅限于临时表?
我是运行宁MySQL5.5
编辑:我正在使用 PHP 和 PDO 来 运行 命令。根据@phreakv6 的回答,会话可能存在问题
编辑 2:我的完整测试代码:
<?php
$dbh=new PDO("mysql:host=localhost;dbname=scratch;charset=utf8", 'readonly', 'readonlytestingonlypassword',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$prepped=$dbh->prepare("CREATE TEMPORARY TABLE `TempPermissionsTest` (`ID` INT( 11 ) NOT NULL ,`TestVal` INT( 11 ) NOT NULL )");
$prepped->execute();
$err=$prepped->errorInfo();
if ($err[0]>0) print $err[1]." : ".$err[2];
$prepped=$dbh->prepare("INSERT INTO `TempPermissionsTest` (`ID` ,`TestVal`) VALUES (1,3)");
$prepped->execute();
$err=$prepped->errorInfo();
if ($err[0]>0) print $err[1]." : ".$err[2];
$prepped=$dbh->prepare("SELECT * FROM `TempPermissionsTest`");
$prepped->execute();
$err=$prepped->errorInfo();
if ($err[0]>0) print $err[1]." : ".$err[2];
while ($row=$prepped->fetch(PDO::FETCH_ASSOC)) {
print_r($row);
}
?>
运行 对只有 SELECT
和 CREATE TEMPORARY TABLES
权限的用户执行此操作会导致以下输出:
1142 : INSERT command denied to user 'readonly'@'localhost' for table 'TempPermissionsTest'
After a session has created a temporary table, the server performs no further privilege checks on the table. The creating session can perform any operation on the table, such as DROP TABLE, INSERT, UPDATE, or SELECT.
看起来您的 CREATE TEMPORARY TABLES
权限应该为您提供 INSERT
、UPDATE
和 DELETE
对创建它的会话的临时 table 权限。这不是你要找的吗?
我刚注意到你的 mysql 版本。对于 mysql 5.5 我认为你运气不好。请看一下this bug。 CREATE TEMPORARY TABLES
权限已扩展到仅包括 INSERT
、UPDATE
和 DELETE
post 5.6.
用更一般的信息补充已接受的答案,以防人们从其他数据库中找到这个问题。
在我合作过的每个数据库管理器中,临时 tables 都旨在成为会话私有的,并以创建者对这些 tables 具有权限的方式实现。如前所述,在 MySQL 中,临时 tables 没有权限检查。
在 PostgreSQL 中,临时 tables 最初由对它们拥有完全权限的创建者拥有。所有者可以撤销权限,甚至理论上可以撤销所有权,但我不知道有任何实际执行此操作的应用程序。
我希望地球上的所有其他(或者即使有例外,几乎所有其他)RDBMS 都有效地将临时 table 权限默认为创建它们的用户的完全权限。如果不这样做,将严重限制此功能的实用性。
我有一个用户在从属数据库上只有 SELECT
和 CREATE TEMPORARY TABLES
权限,以确保从属数据库不会在复制之外更改表,但是无法 INSERT
(以及 UPDATE
和 DELETE
)在任何创建的临时表上,CREATE TEMPORARY TABLES
权限是相当无用的。
是否可以授予这些权限但仅限于临时表?
我是运行宁MySQL5.5
编辑:我正在使用 PHP 和 PDO 来 运行 命令。根据@phreakv6 的回答,会话可能存在问题
编辑 2:我的完整测试代码:
<?php
$dbh=new PDO("mysql:host=localhost;dbname=scratch;charset=utf8", 'readonly', 'readonlytestingonlypassword',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$prepped=$dbh->prepare("CREATE TEMPORARY TABLE `TempPermissionsTest` (`ID` INT( 11 ) NOT NULL ,`TestVal` INT( 11 ) NOT NULL )");
$prepped->execute();
$err=$prepped->errorInfo();
if ($err[0]>0) print $err[1]." : ".$err[2];
$prepped=$dbh->prepare("INSERT INTO `TempPermissionsTest` (`ID` ,`TestVal`) VALUES (1,3)");
$prepped->execute();
$err=$prepped->errorInfo();
if ($err[0]>0) print $err[1]." : ".$err[2];
$prepped=$dbh->prepare("SELECT * FROM `TempPermissionsTest`");
$prepped->execute();
$err=$prepped->errorInfo();
if ($err[0]>0) print $err[1]." : ".$err[2];
while ($row=$prepped->fetch(PDO::FETCH_ASSOC)) {
print_r($row);
}
?>
运行 对只有 SELECT
和 CREATE TEMPORARY TABLES
权限的用户执行此操作会导致以下输出:
1142 : INSERT command denied to user 'readonly'@'localhost' for table 'TempPermissionsTest'
After a session has created a temporary table, the server performs no further privilege checks on the table. The creating session can perform any operation on the table, such as DROP TABLE, INSERT, UPDATE, or SELECT.
看起来您的 CREATE TEMPORARY TABLES
权限应该为您提供 INSERT
、UPDATE
和 DELETE
对创建它的会话的临时 table 权限。这不是你要找的吗?
我刚注意到你的 mysql 版本。对于 mysql 5.5 我认为你运气不好。请看一下this bug。 CREATE TEMPORARY TABLES
权限已扩展到仅包括 INSERT
、UPDATE
和 DELETE
post 5.6.
用更一般的信息补充已接受的答案,以防人们从其他数据库中找到这个问题。
在我合作过的每个数据库管理器中,临时 tables 都旨在成为会话私有的,并以创建者对这些 tables 具有权限的方式实现。如前所述,在 MySQL 中,临时 tables 没有权限检查。
在 PostgreSQL 中,临时 tables 最初由对它们拥有完全权限的创建者拥有。所有者可以撤销权限,甚至理论上可以撤销所有权,但我不知道有任何实际执行此操作的应用程序。
我希望地球上的所有其他(或者即使有例外,几乎所有其他)RDBMS 都有效地将临时 table 权限默认为创建它们的用户的完全权限。如果不这样做,将严重限制此功能的实用性。