2012-04-16 8 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. 사용자를 1, 2 d 3pictures 테이블에 새 항목을 추가 할 수 있습니다.
  2. 사용자 1, 23행만이을 수정할 수 있습니다 userID의 respecitvely 1, 23, 나는이 아닌 사소한, 그래서 추가 질문을 자유롭게 할 수 알고

및 나는이 질문을 그에 맞게 편집 할 것이다.

첫 번째 항목에 대한

답변

2

this answer 오프 그리기 내가 이것을 함께 넣어 :

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 테이블 경기에서 이름을 가정

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 테이블이 가정 데이터베이스 사용자 이름은 SELECT SUBSTRING_INDEX(USER(), '@', 1)으로 반환됩니다.

또한 업데이트 만 발생하지 않도록주의하십시오. 엔트리의 생성/삭제를 막기 위해 삽입/삭제 트리거를 추가로 생성해야합니다.

마지막으로 누군가가 그림 테이블에서 항목의 userID를 변경하지 못하게하여 추가 편집에서 해당 항목을 잠급니다. 이 점이 중요하면 트리거에 추가 체크를 추가 할 수 있습니다.

1

, 당신은 단지 사용자의 경우 1, 2의 사진 테이블에 INSERT 권한을 부여 할 수 있으며, 3 번째 항목에 대한

, 당신은 다음을 수행 할 수 :

A.이 추가로 테이블 만들기를 (db_logins)는 userID와 데이터베이스 로그인 간의 매핑을 포함합니다.

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

B. 업데이트 할 때마다 WHERE 절에 db_loginname이 있는지 확인하십시오. 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

사용자 이름을 기반으로 행의 수정을 거부하는 테이블에 트리거를 추가 할 수 있습니까? –

+0

나는 그것에 대해서도 생각했다. 그러나 넓은 업데이트 문장에 대해서는 잘 작동하지 않을지도 모른다고 깨달았다. OP는 현재 사용자/업데이트 매개 변수와 일치하는 행만 업데이트하고 다른 것은 무시하려고한다. – BluesRockAddict

+0

감사합니다. 다른 사용자의 데이터 행을 삭제하는 것을 방지하는 방법이 궁금합니다.Corey가 위에서 언급 한 것처럼 ("트리거") 내가 이것을 시행 할 수있는 방법이 있습니까? – puk

관련 문제