2011-03-30 157 views
2

这是跟进:MySQL临时视图可能吗?

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 VIEWDROP权限(DROP是必需的,因为or REPLACE)。我不希望他们具有DROP权限,因为目录用户将位于apache拥有的PHP文件中,并且他们不仅限于使用dir - 因此他们只能查看用户并通过。

此外,我不希望用户只是使用bob_rooms时,他实际上是joe。我只希望仅在该特定连接处为该用户创建视图,并且只要该连接消失就立即删除该视图。我不能依靠用户以DROP自己的观点。

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

我SQLlite想这将是一样简单:

CREATE TEMP VIEW ... 

SqlLite可以做临时的观点,但MySQL不能?

+1

为什么你需要放弃它们?这不像他们是静态的或任何东西(尽管我怀疑这种方式限制用户访问的权限,或者授予在不能被信任时编写自己的SQL查询的权利)。 – Wrikken 2011-03-30 22:18:28

+0

因为如果视图没有被删除,任何用户都可以在知道用户名的情况下查看其他用户的信息。这个想法是目录数据库包含有关他们的服务器的信息。一些信息是私人的。我给他们访问他们自己的信息,以便他们可以使用它来向他们的访问者显示信息。 – ParoX 2011-03-30 23:27:49

+0

现在有什么不同?他们仍然可以,他们只是有更少的时间去做它.. – Wrikken 2011-03-30 23:29:33

回答

2

我不知道临时视图,但支持临时表。所以你可以做一些你创建一个临时表的结构与他们镜像的表相同的临时表,例如房间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 ... ; 

的告诫到临时表:

+0

一个好的100个左右的用户使得mysql用户的想法略微超出了顶层。我也考虑过创建临时表,但是我必须给予用户INSERT权限,这是我不想让他们拥有的权限......虽然我可以限制不能访问主表......我可能会使用这个。 – ParoX 2011-03-30 23:27:13

+0

我还没有投入时间研究这个想法,但是调查的一个途径是创建临时表,插入并将其放入存储过程。然后,'目录'用户可以被授予对该过程的访问权限,并且不给予插入访问权限。 – user470714 2011-03-31 03:34:58

-1

您可以一步到位的语法创建一个查询的临时表

  • 他们不是indexed--大的临时表唐表现不佳。
  • 它们只存在于它们创建的会话范围内。