这是跟进:
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
是因为 或 REPLACE
而需要)。我不希望他们有 DROP
权限,因为目录用户将在 apache 拥有的 PHP 文件中,并且他们不使用 dir
限制它 - 所以他们可以只需查看用户并通过。
此外,我不希望用户在实际上是 joe
时只使用 bob_rooms
。我只希望在该特定连接上仅为该用户创建 View ,并在连接消失后立即删除。我不能指望用户自行DROP
View 。
此外,拥有一个自动删除的临时 View 将消除 或 REPLACE
的使用,这意味着我可以为用户获取奇怪的 DROP
权限。
我想在 SQLlite 中它会很简单:
CREATE TEMP VIEW ...
SqlLite 可以做临时 View ,而 MySQL 不能?
最佳答案
我不知道临时 View ,但支持临时表。因此,您可以做一些事情,在其中创建一个临时表,该表的结构与它们正在镜像的表具有相同的结构,例如房间的 temp_bob_rooms。然后在临时表中插入一个从真实表中选择的内容,并加上适当的限制,例如:
INSERT INTO temp_bob_rooms (SELECT * FROM rooms WHERE user='bob');
然后当用户完成他的 session 时,临时表将自动删除,因此目录用户不再需要 DROP 访问。您可以在此处阅读有关临时表的更多信息:
http://www.tutorialspoint.com/mysql/mysql-temporary-tables.htm
这种方法的缺点是,在与临时表的 session 打开期间,不会使用插入“真实”表中的数据更新临时表。
另一种方法可能是简单地编写一个脚本,该脚本将为每个真实用户生成一个 mysql 用户、适当的 View ,并将对这些 View 的权限授予适当的用户。该方法的唯一缺点是您的 db.php 文件将不再对任何人有用,因为每个用户都必须使用正确的密码和用户名创建他或她自己的连接。
关于php - MySQL 临时 View 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5492969/