【问题标题】:Is it possible to grant insert, update and delete privileges only on temporary tables with MySQL?是否可以仅在 MySQL 的临时表上授予插入、更新和删除权限?
【发布时间】:2016-06-07 06:00:05
【问题描述】:

我有一个用户在从属数据库上只有SELECTCREATE TEMPORARY TABLES 权限,以确保从属不会在复制之外更改表,但无法INSERT(和@987654324 @ 和 DELETE) 在任何创建的临时表上,CREATE TEMPORARY TABLES 权限是相当无用的。

是否可以授予这些权限但仅限于临时表?

我正在运行 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);
}
?>

在只有SELECTCREATE TEMPORARY TABLES 权限的用户上运行此命令会产生以下输出:

1142 : INSERT command denied to user 'readonly'@'localhost' for table 'TempPermissionsTest'

【问题讨论】:

    标签: php mysql temp-tables sql-grant


    【解决方案1】:

    会话创建临时表后,服务器不再对该表执行权限检查。创建会话可以对表执行任何操作,例如 DROP TABLE、INSERT、UPDATE 或 SELECT。

    看起来您的CREATE TEMPORARY TABLES 权限应该为您提供在创建它的会话的临时表上的INSERTUPDATEDELETE 权限。这不是你要找的吗?

    我刚刚注意到你的 mysql 版本。对于 mysql 5.5,我认为您不走运。请查看this bugCREATE TEMPORARY TABLES 权限已扩展到包括 INSERTUPDATEDELETE 仅在 5.6 之后。

    【讨论】:

    • 嗯,我在尝试更新表格时收到 1142 UPDATE command denied to user 错误,INSERTDELETE 也是如此
    • 我认为“临时表”的想法是非持久存在的。所以特权只对会话有效,而不是超出。您是否尝试通过不同的连接访问会话之外的临时表,但可能是针对同一用户?
    • 我不这么认为。我在代码中 CREATE TEMPORARY TABLE 之后的行上创建了一个带有 am INSERT 查询的测试文件,它失败并出现相同的权限被拒绝错误。我可以SELECT 没有错误,我认为这意味着我仍在会话中(否则它会说找不到表,对吗?)
    • 请查看我更新的答案。我无法在评论中发布链接。
    • 啊,这样就行了。我想我需要考虑升级到 5.6
    【解决方案2】:

    用更一般的信息补充接受的答案,以防人们从其他数据库中找到这个问题。

    在我使用过的每个数据库管理器中,临时表都被设计为会话私有的,并以创建者对这些表具有权限的方式实现。如前所述,在 MySQL 中,对临时表没有权限检查。

    在 PostgreSQL 中,临时表最初由对其拥有完全权限的创建者所拥有。所有者可以撤销权限,甚至在理论上撤销所有权,尽管我不知道有任何应用程序实际这样做。

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

    【讨论】:

      猜你喜欢
      • 2020-10-23
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 2021-04-25
      相关资源
      最近更新 更多