繁体   English   中英

MySQL临时视图可能吗?

[英]MySQL Temporary View possible?

这是跟进:

仅允许用户从数据库中获取某些信息

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

包含的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权限(因为or REPLACE而需要DROP )。 我不希望他们拥有DROP权限,因为目录用户将在apache拥有的PHP文件中,并且他们不使用dir限制它 - 所以他们只能查看用户并通过。

另外,当他实际上是joe时,我bob_rooms用户只使用bob_rooms 我只希望仅为该特定连接的用户创建视图,并在连接消失后立即创建DROP。 我不能依靠用户自己DROP视图。

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

我想在SQLlite中它会像以下一样简单:

CREATE TEMP VIEW ...

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

我不知道临时视图,但是支持临时表。 所以你可以做一些事情来创建一个临时表,其结构与它们镜像的表相同,例如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文件不再对任何人有用,因为每个用户都必须使用正确的密码和用户名创建自己的连接。

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

CREATE TEMPORARY TABLE temp_table_name SELECT ... ;

对临时表的警告:

  • 它们没有编入索引 - 大型临时表表现不佳。
  • 它们只存在于它们创建的会话范围内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM