[英]Trying to eliminate Temporary Tables MYSQL and combine process into one statement if possible
[英]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());
用户“目录”必须具有SELECT
, CREATE VIEW
和DROP
权限(因为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.