2012-04-16 55 views
1

我挺數據庫小白:-(如果我有一個簡單的檯面設計,就像這樣:限制訪問行的子集在MySQL

CREATE TABLE IF NOT EXISTS picture 
(
ID INT NOT NULL AUTO_INCREMENT, 
userID INT NOT NULL, 
name VARCHAR(150), 

PRIMARY KEY(ID), 
FOREIGN KEY (userID) REFERENCES user(ID) 
)ENGINE=InnoDB 

和描述,例如,像這樣:

+----+--------+------+ 
| ID | userID | name | 
+----+--------+------+ 
| 1 |  1 | john | 
| 2 |  1 | jack | 
| 3 |  2 | amir | 
| 4 |  2 | chan | 
| 5 |  2 | jose | 
| 6 |  3 | jane | 
| 7 |  3 | buba | 
+----+--------+------+ 

我將如何設計出滿足以下兩個約束數據庫:

  1. 用戶12的d 3可以將新條目添加到pictures表中。
  2. 用戶123可以修改只有那些行具有userID小號123,respecitvely

我知道這可能是不平凡的,所以隨意問任何其他問題和我將相應地編輯這個問題。

回答

2

抽出的this answer我把這個在一起:

delimiter // 
CREATE TRIGGER trig_picture BEFORE UPDATE ON picture 
FOR EACH ROW 
BEGIN 
    DECLARE dummy INT; 
    IF NOT EXISTS (select ID from users where ID = OLD.userID and name = (SELECT SUBSTRING_INDEX(USER(), '@', 1))) THEN 
     SET NEW=(SELECT CONCAT("Access Denied for user ", SUBSTRING_INDEX(USER(), '@', 1), "; uid ", OLD.userID)); 
    END IF; 
END;// 
delimiter ; 

這裏假設你有一個users表的一些記錄:

CREATE TABLE IF NOT EXISTS users (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(150)); 
insert into users values (1, 'adam'); 
insert into users values (2, 'bob'); 
insert into users values (3, 'clark'); 

這是假設在users表匹配的名稱數據庫用戶名由SELECT SUBSTRING_INDEX(USER(), '@', 1)返回。

此外,請注意,這隻能防止更新發生。您還必須創建其他插入/刪除觸發器以防止創建/刪除條目。

最後,這並不妨礙某人更改圖片表中的條目的用戶ID,基本上將其從進一步的編輯中鎖定出來。如果這對你很重要,你可以在觸發器中添加一個額外的檢查。

1

的第一個項目,你可以只授予INSERT權限圖片表用戶1,2和3

對於第二個項目,你可以做到以下幾點:

A.創建一個額外的表(db_logins),它包含用戶標識和數據庫登錄之間的映射。

+----+--------+--------------+ 
| ID | userID | db_loginname | 
+----+--------+--------------+ 
| 1 |  1 | dbLogin1  | 
| 2 |  2 | dbLogin2  | 
| 3 |  3 | dbLogin3  | 
+----+--------+--------------+ 

B.每當您進行更新時,將db_loginname的檢查添加到WHERE子句中。 UPDATE語句會是這個樣子(我沒有在時刻訪問MySQL實例,因此我無法驗證語法):

UPDATE pictures 
SET name = 'new name' 
FROM pictures 
INNER JOIN db_logins 
    ON pictures.userID = db_logins.userID 
WHERE name = 'buba' 
    AND db_loginname = user() 
+1

也許在表上添加一個觸發器,拒絕基於用戶名的行修改? – 2012-04-16 06:29:16

+0

我也考慮過它,但後來認識到它可能不適用於廣泛的更新語句_如果OP想只更新匹配當前用戶/更新參數的行並忽略其他參數。 – BluesRockAddict 2012-04-16 06:34:09

+0

謝謝你的回覆。我很好奇這將如何防止用戶刪除其他人的數據行?無論如何,我可以強制執行這一點,就像Corey提到的那樣(「觸發器」)。 – puk 2012-04-16 07:13:38