2012-04-18 3 views
4

이 질문 몇 테이블 : 나는 새 사용자에게 거의 모든 권한을 부여하지만, 여전히 하나 개 이상의 테이블을 유지할 수있는 방법

/데이터베이스 그들로부터 보호.그랜트 [거의] 모든 MySQL의 권한/

세부 사항 :

나는 하나의 데이터베이스,

    life

  • 그리고 세 개의 테이블

    • passwords
    • 이있는 경우 내가 예를 들어, 다음과 같은 권한이 사용자를 제공하려면 어떻게
    • hobbies

    :

    • INSERT
    • UPDATE
    • 가 생성, 삭제
    • 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 권한은 제한되어 있습니다. 그들은'deny' 권한을 허용하지 않습니다. –

    +0

    @TheScrumMeister 만약 당신이 대답 – puk

    +0

    을 게시하면 답변으로 받아 들일 것입니다. MySql 사용 권한을 처리 한 사람으로서 이것은 내가 (여러) 제한 사항 중 하나입니다. –

    답변

    2

    CREATE TABLE를 래핑하지만 프로 시저를 정의하는 것입니다 별도의 데이터베이스를 사용 @ TheScrumMeister의 제안에 대한 대안이 호출하는 사용자에게 그것에 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

    관련 문제