Bir önceki yazıda PostgreSQL kullanıcı işlemlerinin nasıl yapıldığından bahsetmiştik. Bu yazıda ise PostgreSQL kullanıcısının, erişim izinlerini düzenleyen DCL (Data Control Language) ifadelerden bahsedilmektedir. PostgreSQL DCL ifadeleri şu şekildedir:
- GRANT
- REVOKE
Aşağıdaki örneklerde bir kullanıcı (username) için yetki verme ve alma işlemi yapılsa da, username yerine bir grup adı da kullanılabilir. Bu şekilde, kullanıcı grubuna dahil olan bütün kullanıcılar yetkilendirilmiş olur.
Bir kullanıcının yetki işlemlerini yapabilmesi için öncelikle superuser yetkilerine sahip olması gerekmektedir.
Superuser Durum Değişimi
Kullanıcıyı superuser durumuna getir.
ALTER USER myuser WITH SUPERUSER;
Kullanıcının superuser durumunu kaldır.
ALTER USER username WITH NOSUPERUSER;
Veritabanı Yetkileri
Kullanıcıya, veritabanı oluşturma yetkisi ver.
ALTER USER username CREATEDB;
Kullanıcıya, veri tabanına bağlanma yetkisi ver.
GRANT CONNECT ON DATABASE database_name TO username;
Kullanıcıdan veritabanı bağlanma yetkisini geri al.
REVOKE CONNECT ON DATABASE database_name FROM username;
Kullanıcıya, veritabanındaki tüm ayrıcalıkları ver.
GRANT ALL PRIVILEGES ON DATABASE database_name TO username;
Kullanıcıdan, veritabanındaki tüm ayrıcalıkları geri al.
REVOKE ALL PRIVILEGES ON DATABASE database_name FROM username;
Schema ve Object Yetkileri
Kullanıcılar, şema içerisinde bulunan table, column, sequence gibi nesneler üzerinde yetkilendirilebilirler.
Kullanıcıya şema kullanım yetkisi ver.
GRANT USAGE ON SCHEMA schema_name TO username;
Kullanıcıdan şema kullanım yetkisini geri al.
REVOKE USAGE ON SCHEMA schema_name FROM username;
Kullanıcının, bir tablo üzerinde SELECT, INSERT, UPDATE, DELETE gibi DML(Data Manipulation) ifadelerini kullanım yetkilerini vermek mümkündür.
Kullanıcıya şemadaki bütün tablolar için yetki ver.
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES
IN SCHEMA schema_name TO username;
Kullanıcının şemadaki bütün tablolarda bulunan yetkilerini geri al.
REVOKE SELECT, INSERT, UPDATE, DELETE ON ALL TABLES
IN SCHEMA schema_name FROM username;
Kullanıcıya tek bir tabloya için yetki ver.
GRANT SELECT, INSERT, UPDATE, DELETE ON table_name
IN SCHEMA schema_name TO username;
Bir şemeda bulunan bütün tablolar için, kullanıcıya bütün yetkileri ver.
GRANT ALL PRIVILEGES ON ALL TABLES
IN SCHEMA schema_name TO username;
Bir şemeda bulunan bütün tablolara ait bütün yetkileri kullanıcıdan geri al.
REVOKE ALL PRIVILEGES ON ALL TABLES
IN SCHEMA schema_name FROM username;
Bir şemeda bulunan bütün dizeler(sequence) için, bütün yetkileri ver.
GRANT ALL PRIVILEGES ON ALL SEQUENCES
IN SCHEMA schema_name TO username;
Bir şemeda bulunan bütün dizeler(sequence) için, bütün yetkileri geri al.
REVOKE ALL PRIVILEGES ON ALL SEQUENCES
IN SCHEMA schema_name FROM username;
Yukarıdaki şema içi yetkiler, veritabanına mevcut olan tablolar için geçerlidir. Eğer şemada yeni oluşturulan tablolar için de kullanıcıya tüm yetkiler vermek için şöyle bir ifade kullanılabilir:
ALTER DEFAULT PRIVILEGES
FOR USER username
IN SCHEMA schema_name
GRANT ALL ON TABLES TO username;
Tablo üzerindeki yetkilerin sorgulanması
Bir tabloda hangi kullanıcıların hangi yetkilere sahip olduğunu öğrenebilmek için gerekli komut:
SELECT
grantee,
string_agg(privilege_type, ', ') AS privileges
FROM
information_schema.role_table_grants
WHERE
table_name='table_name'
GROUP BY
grantee;