问题:MySQL 临时视图可以吗?

这是跟进:

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

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

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- 所以他们可以查看用户并通过。

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

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

我猜在 SQLite 中它会很简单:

CREATE TEMP VIEW ...

Sqlite 可以做临时视图,而 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 文件将不再对任何人有用,因为每个用户都必须使用正确的密码和用户名创建自己的连接。

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐