2011-03-30 72 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--大的臨時表唐表現不佳。
  • 它們只存在於它們創建的會話範圍內。