Pertama, Anda harus dapat terhubung ke database untuk menjalankan kueri. Ini bisa dicapai dengan
REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;
GRANT CONNECT
ON DATABASE database_name
TO user_name;
Itu REVOKE
perlu karena
Kata kunci PUBLIC menunjukkan bahwa hak istimewa harus diberikan kepada semua peran, termasuk yang mungkin dibuat nanti. PUBLIC dapat dianggap sebagai kelompok yang didefinisikan secara implisit yang selalu mencakup semua peran. Setiap peran tertentu akan memiliki jumlah hak istimewa yang diberikan secara langsung kepadanya, hak istimewa yang diberikan kepada peran apa pun yang saat ini menjadi anggotanya, dan hak istimewa yang diberikan kepada PUBLIC.
Jika Anda benar-benar ingin membatasi pengguna Anda pada pernyataan DML, maka Anda harus melakukan lebih banyak lagi:
REVOKE ALL
ON ALL TABLES IN SCHEMA public
FROM PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public
TO user_name;
Ini mengasumsikan bahwa Anda hanya akan memiliki satu skema (yang dinamai 'publik' secara default).
Seperti yang ditunjukkan Jack Douglas, hal di atas hanya memberikan hak istimewa untuk tabel yang sudah ada . Untuk mencapai hal yang sama untuk tabel di masa mendatang, Anda harus mendefinisikan hak default :
ALTER DEFAULT PRIVILEGES
FOR ROLE some_role -- Alternatively "FOR USER"
IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;
Di sini, some_role
adalah peran yang menciptakan tabel, sementara user_name
adalah orang yang mendapatkan hak istimewa. Mendefinisikan ini, Anda harus masuk sebagai some_role
atau menjadi anggota.
Dan, akhirnya, Anda harus melakukan hal yang sama untuk urutan (terima kasih kepada PlaidFan untuk menunjukkannya) - ini dia USAGE
hak istimewa yang Anda butuhkan.
FOR some_role
adalah bagian penting yang saya lewatkan untuk membuatnya berfungsi untuk tabel saya yang dibuat nanti. Tapi saya tidak harus masuk karenasome_role
, itu berfungsi juga jika saya menjalankan kueri sebagaipostgres
pengguna admin default .