这是跟进:
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());
用户“目录”必须具有SELECT
,CREATE VIEW
和DROP
权限(DROP
)需要or REPLACE
。我不希望他们拥有DROP
权限,因为目录用户将在apache拥有的PHP文件中,并且他们不会使用dir
限制它 - 所以他们只能查看用户并通过
另外,当他实际上bob_rooms
时,我不想让用户joe
。我只希望仅为该特定连接的用户创建视图,并在连接消失后立即创建DROP。我无法依靠用户自己查看DROP
视图。
此外,拥有一个自动删除的临时视图将消除or REPLACE
的使用,这意味着我可以为用户提供奇怪的DROP
权限。
我想在SQLlite中它会像以下一样简单:
CREATE TEMP VIEW ...
SqlLite可以做临时视图,但MySQL不能吗?
答案 0 :(得分:3)
我不知道临时视图,但是支持临时表。所以你可以做一些事情来创建一个临时表,其结构与它们镜像的表相同,例如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文件不再对任何人有用,因为每个用户都必须使用正确的密码和用户名创建自己的连接。
答案 1 :(得分:0)
您可以使用以下语法一步从查询创建临时表:
CREATE TEMPORARY TABLE temp_table_name SELECT ... ;
对临时表格的警告: