2012-04-18 63 views
4

問:

我怎麼可以給新的用戶幾乎所有的權限,但仍保留一個或多個表/保護他們的數據庫。格蘭特[幾乎]所有MySQL權限爲所有,但一個/幾張桌子

詳情:

如果我有一個數據庫,

  • life

三和表

  • passwords
  • friends
  • hobbies

我怎麼給這個用戶,例如,以下特權:

  • INSERT
  • UPDATE
  • DELETE
  • CREATE
  • DROP
  • ALTER

對於前三,我會的東西開始,像這樣:

GRANT INSERT, UPDATE, DELETE ON life.friends TO [email protected]'localhost' IDENTIFIED BY 'password'; 
GRANT INSERT, UPDATE, DELETE ON life.hobbies TO [email protected]'localhost' IDENTIFIED BY 'password'; 

但我很困惑,如何使用CREATEDROP。如果我承認在整個數據庫上放棄特權,像這樣:

GRANT DROP ON life TO [email protected]'localhost' IDENTIFIED BY 'password'; 

然後用戶可以刪除passwords表,這是我不想要的。我可以改爲授予它基於表像這樣:

GRANT DROP ON life.friends TO [email protected]'localhost' IDENTIFIED BY 'password'; 
GRANT DROP ON life.hobbies TO [email protected]'localhost' IDENTIFIED BY 'password'; 

不過,如果我承認喜歡CREATE特權,因此會發生什麼:

GRANT CREATE ON life TO [email protected]'localhost' IDENTIFIED BY 'password'; 

這是否意味着,用戶甚至無法刪除很表他/她創建?我的問題也涉及創建/刪除數據庫。如果我想讓用戶創建和刪除儘可能多的自己的數據庫,但是不是life數據庫?

我是否應該改變我的方法,將passwords表移動到另一個數據庫中?

謝謝您的高級。

+2

單獨的數據庫是要走的路。 MySql權限是有限的。他們不允許「拒絕」權限。 – 2012-04-18 03:53:18

+0

@TheScrumMeister我會接受,如果您發佈它的答案 – puk 2012-04-18 03:53:58

+0

它不是一個完整的答案;-)。作爲處理MySql權限的人,這是我遇到的(許多)限制之一。 – 2012-04-18 03:56:09

回答

2

到@ TheScrumMeister的使用單獨的數據庫是定義一個包裝CREATE TABLE,也是一個過程的建議的替代授予調用用戶在其上的DROP權限:

DELIMITER ;; 

CREATE PROCEDURE create_table(
    tbl_name VARCHAR(64) -- maximum length of a table name 
) BEGIN 
    DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; 
    START TRANSACTION; 
    SET @usr = SUBSTRING_INDEX(USER(), '@', 1); -- invoking username 
    SET @tbl = REPLACE(tbl_name, "`", "``");  -- prevent SQL injection 

    -- just create some dummy table initially - the user can modify it after 
    SET @qry = CONCAT(" 
     CREATE TABLE `", @tbl, "` (
     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
    ); 
    "); 
    PREPARE stmt FROM @qry; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    -- now grant DROP to the invoking user but only from localhost 
    SET @qry = CONCAT(" 
     GRANT DROP ON life.`", @tbl, "` 
     TO CONCAT(?, \"@'localhost'\") IDENTIFIED BY 'password'; 
    "); 
    PREPARE stmt FROM @qry; 
    EXECUTE stmt USING @usr; 
    DEALLOCATE PREPARE stmt; 

    -- clean up 
    SET @qry = NULL; 
    SET @usr = NULL; 
    COMMIT; 
END;; 

DELIMITER ; 

要確定用戶沒有按以其他方式創建表,他們不應具有CREATE TABLE權限。

你也可以爲數據庫做類似的事情。

+0

我從來沒有想到這一點。謝謝 – puk 2012-04-30 19:18:29