2017-04-05 139 views
1

爲了記錄數據庫項目操作的作者憑據(如創建或更新操作),我使用了以下的架構:獲取mysql.user唯一ID?

CREATE TABLE Items 
(id integer not null primary key auto_increment 
, Item_data varchar(50) not null 
, Item_lastmodified_author_name varchar(50) not null 
, Item_lastmodified_author_host varchar(100) not null 
, foreign key (Item_lastmodified_author_name) references mysql.user (User) 
, foreign key (Item_lastmodified_author_host) references mysql.user (Host) 
); 

是沒可能使這個具有獨特的MySQL更容易。用戶標識參考?

一個MySQL服務器用於3個團隊。每個團隊都有自己的數據庫。因爲MySQL查詢將從客戶端完成。我不希望用戶是一個團隊的成員,能夠更改另一個團隊數據庫中的任何內容。

我正確的做法嗎?

回答

1

號你的外鍵將不工作,你的思考方式有以下幾個原因:

  • mysql.user表是MyISAM數據,在MySQL的當前版本不InnoDB表。 MyISAM不支持外鍵。
  • 您誤解了多列外鍵的語法。你不會爲每一列創建一個單獨的外鍵,而是使一個由兩個列組成的外鍵引用目標表的主鍵。
  • 即使您可以將外部密鑰設置爲mysql.user,這也允許任何團隊在該表中引用任意用戶,而不僅僅是他們自己的用戶。

爲什麼不限制每個團隊用戶的權限?

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, 
    EXECUTE ON `team1`.* TO 'team1user'@'%'; 

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, 
    EXECUTE ON `team2`.* TO 'team2user'@'%'; 

等等

注意,他們可能需要其他特權,但你不應該給予他們SUPER權限,或關機或一些人。 :-)


回覆您的評論:

MySQL沒有任何數據的概念是由特定用戶所「擁有」。用戶有權讀取或更改數據,但他們不擁有它。

您可以使用列來存儲看起來像用戶&主機的數據值,但是如何確保您的團隊無法將這些值設置爲他們想要的值?你可以設計一個觸發器來做到這一點,但團隊可以修改觸發器。

無論如何,您爲什麼要在表中記錄用戶&主機,因爲您已經授予權限,以便只有合適的團隊才能訪問其各自的數據庫?

+0

好的權限,但沒有辦法獲得作爲錄製字段的用戶ID?例如,在數據庫中保存誰是項目所有者的知識? – Erwan

+0

謝謝你的回答! – Erwan