【问题标题】:MySQL Temporary View possible?MySQL临时视图可能吗?
【发布时间】:2011-07-26 11:09:10
【问题描述】:

这是跟进:

Allow users only certain information from database

我正在做这样的视图(我相信这可以优化):

db.php 包含在内:

$conn = mysql_connect("localhost","directory","dghgffhghf") or die(mysql_error());

mysql_select_db("directory", $conn) or die(mysql_error());  

mysql_query("CREATE or REPLACE VIEW {$user}_rooms AS SELECT * FROM rooms WHERE palace = '$user'") or die(mysql_error()); 
mysql_query("CREATE or REPLACE VIEW {$user}_users AS SELECT * FROM users WHERE palace = '$user'") or die(mysql_error()); 
mysql_query("CREATE or REPLACE VIEW {$user}_servers AS SELECT * FROM servers WHERE palace = '$user'") or die(mysql_error()); 
mysql_query("CREATE or REPLACE VIEW {$user}_online_servers AS SELECT * FROM online_servers WHERE palace = '$user'") or die(mysql_error()); 

用户“目录”必须拥有SELECTCREATE VIEWDROP 权限(DROP 是必需的,因为or REPLACE)。我不希望他们拥有 DROP 权限,因为目录用户将位于 apache 拥有的 PHP 文件中,并且他们不限于使用 dir - 所以他们可以查看用户并通过。

另外,我不希望用户只使用bob_rooms,而他实际上是joe。我只想为该特定连接上的该用户创建视图,并在连接消失后立即删除。我不能指望用户自己DROP查看。

另外,拥有一个可以自动删除的临时视图将消除or REPLACE 的使用,这意味着我可以为用户获取奇怪的DROP 权限。

我猜在 SQLlite 中它会很简单:

CREATE TEMP VIEW ...

SqlLite 可以做临时视图,但 MySQL 不能?

【问题讨论】:

  • 为什么要删除它们?这不像它们是静态的或任何东西(尽管我怀疑以这种方式限制用户访问的计划的合理性,或者当他们不能被信任时授予编写自己的 SQL 查询的权利)。
  • 因为如果视图没有丢弃它们,任何用户只要知道他们的用户名就可以查看其他用户的信息。这个想法是目录数据库包含有关其服务器的信息。有些信息是私密的。我允许他们访问自己的信息,以便他们可以使用这些信息向访问者显示信息。
  • 跟现在有什么区别?他们仍然可以,只是时间少了..
  • 我希望 mySQL 有一个临时视图,就像临时表一样,只有创建该表的连接才能访问该表。因此,当他们运行他们的 PHP 文件时,将为他们创建一个视图/表格,他们将无法访问其他任何内容。
  • 临时视图的惊人之处在于视图可以允许读/写

标签: php mysql sql permissions views


【解决方案1】:

您可以使用以下语法从查询中一步创建临时表:

CREATE TEMPORARY TABLE temp_table_name SELECT ... ;

临时表的注意事项:

  • 它们没有被索引——大型临时表性能不佳。
  • 它们只存在于它们创建的会话范围内。

【讨论】:

  • 临时表可以像往常一样被索引,尽管你应该要求这样做。它不仅可以对现有列(如CREATE TEMPORARY TABLE tmp (KEY smth(foo, bar)) SELECT ..., ... as foo, ... as bar, ... FROM ... ;)具有任何索引配置,而且甚至可以声明带有 auto_increment 的新附加列和主索引:CREATE TEMPORARY TABLE tmp2 (new_pk INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY) AS SELECT tbl.* FROM tblCREATE TABLE ... SELECT 案例的描述已经足够合理,例如在 MySQL 手册中。
【解决方案2】:

我不了解临时视图,但支持临时表。所以你可以做一些事情,你创建一个与它们镜像的表具有相同结构的临时表,例如房间的 temp_bob_rooms。然后在临时表中插入来自真实表的选择,并具有适当的限制,例如:

INSERT INTO temp_bob_rooms (SELECT * FROM rooms WHERE user='bob');

然后当用户完成他的会话时,临时表将被自动删除,因此目录用户不再需要 DROP 访问。您可以在此处阅读有关临时表的更多信息:

http://www.tutorialspoint.com/mysql/mysql-temporary-tables.htm

这种方法的缺点是,在与临时表的会话打开期间,不会使用插入到“真实”表中的数据来更新临时表。

另一种方法可能是简单地编写一个脚本,该脚本将为每个真实用户生成一个 mysql 用户、适当的视图,并将这些视图的权限授予适当的用户。这种方法的唯一缺点是您的 db.php 文件将不再对任何人有用,因为每个用户都必须使用正确的密码和用户名创建自己的连接。

【讨论】:

  • 100 个左右的用户让 mysql 用户的想法有点过头了。我也确实考虑过制作临时表,但我必须给用户 INSERT 权限,这是我不希望他们拥有的东西......虽然我可以限制对主表的非访问......我可能有使用它。
  • 我没有投入时间来研究这个想法,但调查的一个途径是创建临时表、插入并将其放入存储过程中。然后“目录”用户可以被授予对该过程的访问权限,而不是被授予插入访问权限。
猜你喜欢
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2023-02-21
  • 2015-03-12
  • 2015-04-12
  • 2023-03-08
  • 2011-02-15
相关资源
最近更新 更多