Đầu tiên, bạn phải có khả năng kết nối với cơ sở dữ liệu để chạy các truy vấn. Điều này có thể đạt được bởi
REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;
GRANT CONNECT
ON DATABASE database_name
TO user_name;
Điều REVOKE
này là cần thiết bởi vì
Từ khóa PUBLIC chỉ ra rằng các đặc quyền sẽ được cấp cho tất cả các vai trò, bao gồm cả các vai trò có thể được tạo sau này. PUBLIC có thể được coi là một nhóm được xác định ngầm luôn bao gồm tất cả các vai trò. Bất kỳ vai trò cụ thể nào cũng sẽ có tổng số đặc quyền được cấp trực tiếp cho nó, đặc quyền được cấp cho bất kỳ vai trò nào hiện tại là thành viên và đặc quyền được cấp cho PUBLIC.
Nếu bạn thực sự muốn hạn chế người dùng của mình đối với các câu lệnh DML, thì bạn có thêm một chút việc phải làm:
REVOKE ALL
ON ALL TABLES IN SCHEMA public
FROM PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public
TO user_name;
Chúng giả định rằng bạn sẽ chỉ có một lược đồ (được đặt tên là 'công khai' theo mặc định).
Như Jack Douglas đã chỉ ra, ở trên chỉ cung cấp các đặc quyền cho các bảng đã có sẵn . Để đạt được điều tương tự cho các bảng trong tương lai, bạn phải xác định các đặc quyền mặc định :
ALTER DEFAULT PRIVILEGES
FOR ROLE some_role -- Alternatively "FOR USER"
IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;
Ở đây, some_role
là một vai trò tạo ra các bảng, trong khi đó user_name
là người nhận được các đặc quyền. Xác định điều này, bạn phải đăng nhập với tư cách some_role
là thành viên của nó.
Và cuối cùng, bạn phải làm tương tự cho các chuỗi (cảm ơn StripeFan vì đã chỉ ra nó) - đây là USAGE
đặc quyền mà bạn cần.
FOR some_role
là phần quan trọng tôi đã thiếu để làm cho nó hoạt động cho các bảng của tôi được tạo sau này. Nhưng tôi không phải đăng nhậpsome_role
, nó cũng hoạt động nếu tôi thực hiện truy vấn với tư cách làpostgres
người dùng quản trị mặc định .