2011-12-03 43 views
26

Tôi đang chạy một số thử nghiệm và tôi đang cố gắng xem liệu tôi có thể tạo người dùng có quyền truy cập vào chỉ 1 hoặc 2 bảng trong db của tôi hay không. Có ai biết làm thế nào điều này được thực hiện? Mã của tôi dưới đây không thành công:Cấp cho người dùng quyền truy cập vào số lượng bảng hạn chế trong MySQL

GRANT SELECT ON testdb.fruits, testdb.sports TO [email protected] IDENTIFIED BY 'pass'; 

Lỗi nói rằng tôi có lỗi trong cú pháp của mình.

Trả lời

40

Chạy chúng như hai GRANT báo cáo cá nhân:

GRANT SELECT ON testdb.fruits TO [email protected] IDENTIFIED BY 'pass'; 
GRANT SELECT ON testdb.sports TO [email protected] IDENTIFIED BY 'pass'; 

The MySQL GRANT syntax chỉ cho phép một đối tượng ở vị trí priv_level :, dù nó có thể sử dụng một * như một ký tự đại diện:

GRANT 
    priv_type [(column_list)] 
     [, priv_type [(column_list)]] ... 
    ON [object_type] priv_level 
    TO user_specification [, user_specification] ... 
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] 
    [WITH with_option ...] 

object_type: 
    TABLE 
    | FUNCTION 
    | PROCEDURE 

priv_level: 
    * 
    | *.* 
    | db_name.* 
    | db_name.tbl_name 
    | tbl_name 
    | db_name.routine_name 

Phần bên dưới dường như không hoạt động trên MySQL 5.5. How to "subtract" privileges in MySQL giải quyết tại sao.

Cấp SELECT trên tất cả các bảng sau đó chọn lọc thu hồi, bạn có thể làm:

GRANT SELECT ON testdb.* TO [email protected] IDENTIFIED BY 'pass'; 
REVOKE ALL PRIVILEGES ON testdb.tblname FROM [email protected]; 

Điều này dường như là một phương pháp kỳ lạ mặc dù, và tôi nghĩ rằng tôi cá nhân sẽ tài trợ hơn là cá nhân REVOKE.

+0

Thú vị. MySQL có thể loại bỏ quyền truy cập vào các bảng cụ thể không? Bằng cách đó tôi có thể gán 'testdb. *' Sau đó chỉ cần xóa các truy cập vào các bảng mà tôi không muốn chúng truy cập. – enchance

+0

@enchance Có, xem phần bổ sung ở trên. –

+0

Cảm ơn, Michael. Điều đó giải quyết nó. – enchance

0

Bạn có thể sử dụng mysql.tables_priv table trực tiếp:

INSERT INTO mysql.tables_priv (`Host`, `Db`, `User`, `Table_name`, `Grantor`, `Table_priv`) 
VALUES 
('%', DATABASE(), 'someuser', 'mytable1', CURRENT_USER, 'Select,Insert,Update,Delete'), 
('%', DATABASE(), 'someuser', 'mytable2', CURRENT_USER, 'Select,Insert,Update,Delete') 

Sau một cập nhật thủ công cho các bảng này, bạn sẽ cần phải chạy một cách rõ ràng FLUSH PRIVILEGES truy vấn để nói với MySQL để cập nhật bộ nhớ cache cho phép của nó (không cần thiết khi sử dụng GRANT)

Các vấn đề liên quan