Php 是否可以仅在使用MySQL的临时表上授予insert、update和delete权限?

Php 是否可以仅在使用MySQL的临时表上授予insert、update和delete权限?,php,mysql,temp-tables,grant,Php,Mysql,Temp Tables,Grant,我有一个用户在从属数据库上只有选择和创建临时表的权限,以确保从属数据库不会在复制之外更改表,但是如果不能插入、更新和删除已创建的任何临时表,则“创建临时表”权限将毫无用处 是否可以只为临时表授予这些特权 我正在运行MySQL 5.5 编辑:我正在使用PHP和PDO来运行这些命令。根据@phreakv6的回答,可能会话有问题 编辑2:我的完整测试代码: <?php $dbh=new PDO("mysql:host=localhost;dbname=scratch;charset=utf8",

我有一个用户在从属数据库上只有选择和创建临时表的权限,以确保从属数据库不会在复制之外更改表,但是如果不能插入、更新和删除已创建的任何临时表,则“创建临时表”权限将毫无用处

是否可以只为临时表授予这些特权

我正在运行MySQL 5.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);
}
?>
会话创建临时表后,服务器不再对该表执行进一步的权限检查。创建会话可以对表执行任何操作,例如删除表、插入、更新或选择

看起来您的“创建临时表”权限应该为创建临时表的会话提供对临时表的插入、更新和删除权限。这不是你要找的吗


我刚注意到你的mysql版本。对于mysql 5.5,我认为您运气不好。请看一看。“创建临时表”权限已扩展,仅包括5.6版后的插入、更新和删除。

以更一般的信息补充已接受的答案,以防人们从其他数据库中发现此问题

在我使用过的每一个数据库管理器中,临时表都是会话专用的,并且以创建者对这些表拥有权限的方式实现。如前所述,在MySQL中,临时表上没有权限检查

在PostgreSQL中,临时表最初由具有完全权限的创建者拥有。所有者可以撤销权限,甚至在理论上也可以撤销所有权,尽管我不知道有任何应用程序真正做到了这一点


我希望每隔一次,或者即使有例外,地球上几乎每一个其他RDBMS都会有效地将临时表权限默认为创建它们的用户的完全权限。如果不这样做,将严重限制此功能的实用性。

Hmmm,当我尝试更新表时,我收到一个1142 UPDATE命令,拒绝用户错误,INSERT和DELETE也是如此。我认为临时表的概念是非持久存在的。因此,特权仅对会话有效,不超过会话。您是否试图从不同的连接访问会话之外的临时表,可能是针对同一用户?我不这么认为。我在代码中创建临时表之后的行上创建了一个带有am INSERT query的测试文件,但由于相同的权限拒绝错误而失败。我可以选择没有错误,这意味着我仍然在会话中,否则它会说找不到表,对吗?请检查我更新的答案。我无法在评论中发布链接。啊,这样就可以了。我想我需要考虑升级到5.6
1142 : INSERT command denied to user 'readonly'@'localhost' for table 'TempPermissionsTest'