GRANT
s trên các đối tượng khác nhau là riêng biệt. GRANT
nhập vào cơ sở dữ liệu không có GRANT
quyền đối với lược đồ bên trong. Similiarly,GRANT
việc nhập vào một lược đồ không cấp quyền cho các bảng bên trong.
Nếu bạn có quyền SELECT
từ một bảng, nhưng không có quyền xem nó trong lược đồ chứa nó thì bạn không thể truy cập vào bảng.
Các bài kiểm tra quyền được thực hiện theo thứ tự:
Do you have `USAGE` on the schema?
No: Reject access.
Yes: Do you also have the appropriate rights on the table?
No: Reject access.
Yes: Check column privileges.
Sự nhầm lẫn của bạn có thể phát sinh từ thực tế là public
lược đồ có mặc định GRANT
là tất cả các quyền đối với vai trò public
mà mọi người dùng / nhóm đều là thành viên. Vì vậy, mọi người đã có cách sử dụng trên lược đồ đó.
Cụm từ:
(giả sử rằng các yêu cầu đặc quyền riêng của đối tượng cũng được đáp ứng)
Đang nói rằng bạn phải có USAGE
trên một lược đồ để sử dụng các đối tượng bên trong nó, nhưng cóUSAGE
trên một lược đồ tự nó không đủ để sử dụng các đối tượng trong lược đồ, bạn cũng phải có quyền đối với chính các đối tượng đó.
Nó giống như một cây thư mục. Nếu bạn tạo một thư mục somedir
với tệp somefile
bên trong nó, sau đó đặt nó để chỉ người dùng của bạn mới có thể truy cập vào thư mục hoặc tệp (chế độ rwx------
trên dir, chế độ rw-------
trên tệp) thì không ai khác có thể liệt kê thư mục để xem tệp tồn tại.
Nếu bạn cấp quyền đọc trên toàn thế giới đối với tệp (chế độ rw-r--r--
) nhưng không thay đổi quyền đối với thư mục thì điều đó không có gì khác biệt. Không ai có thể nhìn thấy tệp để đọc nó, bởi vì họ không có quyền liệt kê thư mục.
Thay vào đó, nếu bạn đặt rwx-r-xr-x
trên thư mục, đặt nó để mọi người có thể liệt kê và xem qua thư mục nhưng không thay đổi quyền đối với tệp, mọi người có thể liệt kê tệp nhưng không thể đọc được vì họ không có quyền truy cập vào tệp.
Bạn cần đặt cả hai quyền để mọi người thực sự có thể xem tệp.
Điều tương tự trong Pg. Bạn cần cả USAGE
quyền lược đồ và quyền đối tượng để thực hiện một hành động trên một đối tượng, chẳng hạn như SELECT
từ một bảng.
(Sự tương tự giảm xuống một chút là PostgreSQL chưa có bảo mật cấp hàng, vì vậy người dùng vẫn có thể "thấy" rằng bảng tồn tại trong lược đồ bằng cách nhập trực tiếp SELECT
từ đó pg_class
. Họ không thể tương tác với nó theo bất kỳ cách nào Tuy nhiên, vì vậy nó chỉ là phần "danh sách" không hoàn toàn giống nhau.)
CREATE EXTENSION
. Nó ít nhiều là vấn đề tương tự với các tệp được tạo trên Linux khi bạn đang sử dụngsu
. Sẽ rất tốt nếu có một loạisudo -e
câu lệnh for trong pqsl.