Bir nesne oluşturulduğunda ona bir sahip atanır. Sahip, normalde oluşturma(create) sorgusunu yürüten roldür. Çoğu nesne türü için, ilk durum, yalnızca sahibin (veya bir süper kullanıcının) nesne ile her şeyi yapabilmesidir. Diğer rollerin onu kullanmasına izin vermek için, ayrıcalıkların(privilege lerin) verilmesi gerekir.

Farklı ayrıcalık türleri vardır; SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, CREATE, CONNECT, TEMPORARY, EXECUTE ve USAGE. Belirli bir nesne için geçerli olan ayrıcalıklar, nesnenin türüne (tablo, işlev, vb.) bağlı olarak değişir.

Bir nesneyi değiştirme veya silme hakkı her zaman yalnızca sahibinin ayrıcalığına sahiptir. Nesne sahibinin özel ayrıcalıkları (DROP,GRANT,REVOKE vb.) her zaman sahibine aittir başkasına verilemez veya veya iptal edilemez. Ancak nesne için istenirse ALTER komutu ile sahibi değiştirilebilir, örneğin;

 ALTER TABLE table_name OWNER TO new_owner; 

Privilege leri atamak için GRANT komutu kullanılır. Örneğin, mustafa mevcut bir rolse ve hesaplar mevcut bir tablodaysa, tabloyu güncelleme yetkisi şunla verilebilir;

GRANT UPDATE ON hesaplar TO mustafa; 

ALL sözcüğünü kullanırsak bu nesne ile ilgili tüm ayrıcalıkları role verir.

GRANT ALL ON hesaplar TO mustafa; 

PUBLIC özel “rol” adı, sistemdeki her role bir ayrıcalık tanımak için kullanılabilir. Ayrıca, bir veritabanının birçok kullanıcısı olduğunda ayrıcalıkların yönetilmesine yardımcı olmak için “grup” rolleri ayarlanabilir. Aşağıdaki örnekle hesaplar tablosu için bütün rol lere SELECT yetkilesi verilmiştir.

GRANT SELECT ON hesaplar TO PUBLIC; 

Ayrıcalığı iptal etmek yani almak için aşağıdaki gibi REVOKE kelimesini kullanırız;

REVOKE SELECT ON hesaplar FROM PUBLIC; 

Normalde sadece nesnenin sahibi veya superuser nesne üzerinde ayrıcalıklar verebilir veya iptal edebilir. Ancak, istenirse bunu diğerlerine de verme hakkı veren “with grant option” bir ayrıcalık vermek mümkündür.

Mevcut ayrıcalıklar şunlardır:

  • SELECT : Nesnenin herhangi bir sütunundan veya belirli sütunlarından veri okumaya izin verir. COPY TO kullanımınada izin verir. SELECT yetkisi UPDATE ve DELETE içinde gereklidir.
  • INSERT : Yeni bir satırın bir nesneye eklenmesine izin verir. COPY FROM kullanımınada izin verir.
  • UPDATE : Bu yetki ile verilerin güncellemesi yetkisi kazanmış oluruz.
  • DELETE : Verilerin silinmesine izin verir.
  • TRUNCATE : Nesne üzerinde truncate’e izin verir. Yani nesneyi boşaltmaya izinli oluruz.
  • REFERENCES : Bir tabloya veya bir tablonun belirli sütunlarına referans foreign key constraint oluşturulmasına izin verir.
  • TRIGGER : Tablo veya view üzerinde trigger oluşturmaya izin verir.
  • CREATE : Veritabanları için, veritabanı içerisinde yeni schema oluşturulmasına izin verir. Schemalar için, schema içinde yeni nesnelerin oluşturulmasına izin verir. Tablespace için tablolar, indeksler ve geçici dosyaların tablespace içinde oluşturulmasına izin verir
  • CONNECT : Yetki alan kişinin veritabanına bağlanmasına izin verir. Bu ayrıcalık bağlantı başlangıcında kontrol edilir (pg_hba.conf tarafından getirilen kısıtlamaların kontrol edilmesine ek olarak).
  • TEMPORARY : Veritabanı kullanılırken geçici tabloların oluşturulmasına izin verir.
  • EXECUTE : Fonksiyonda kullanılan herhangi bir operatörün kullanımı dahil olmak üzere fonksiyon veya prosedürü çalıştırmaya izin verir.
  • USAGE : Şemalar için, şemada bulunan nesnelere erişime izin verir. Prosedürel diller için, o dilde işlevlerin oluşturulması için dilin kullanılmasına izin verir. Foreign-data wrapper kullanılarak yeni sunucuların oluşturulmasına izin verir. Sequence için currval ve nextval işlevlerinin kullanımına izin verir.


PostgreSQL, nesneler oluşturulduğunda varsayılan olarak bazı nesne türleri için PUBLIC’e ayrıcalıklar verir. PUBLIC’e varsayılan olarak tablolar, tablo sütunları, sequence, foreign data wrappers, foreign server, large objects, schema veya tablespace ayrıcalık verilmez. Diğer nesne türleri için, PUBLIC’e verilen varsayılan ayrıcalıklar aşağıdaki gibidir:

  • Veritabanları için CONNECT ve TEMPORARY (geçici tablolar oluşturma) ayrıcalıkları,
  • Function ve prosedürler için EXECUTE ayrıcalığı,
  • Veri türleri için USAGE ayrıcalığı.

Nesne sahibi elbette hem varsayılan hem de açıkça verilen yetkileri KALDIRABİLİR. Ayrıca, bu varsayılan ayrıcalık ayarları ALTER DEFAULT PRIVILEGES komutu kullanılarak geçersiz kılınabilir.

Aşağıdaki tabloda ACL (Erişim Kontrol Listesi) değerlerinde bu ayrıcalık türleri için kullanılan tek harfli kısaltmaları göstermektedir. Bu harfleri aşağıda listelenen psql komutlarının çıktısında veya sistem kataloglarının ACL sütunlarına baktığınızda göreceksiniz.

Privilege Kısaltma Uygulanabilir Nesne Türleri
SELECT r (“read”) LARGE OBJECT, SEQUENCE, TABLE (and table-like objects), table column
INSERT a (“append”) TABLE, table column
UPDATE w (“write”) LARGE OBJECT, SEQUENCE, TABLE, table column
DELETE d TABLE
TRUNCATE D TABLE
REFERENCES x TABLE, table column
TRIGGER t TABLE
CREATE C DATABASE, SCHEMA, TABLESPACE
CONNECT c DATABASE
TEMPORARY T DATABASE
EXECUTE X FUNCTION, PROCEDURE
USAGE U DOMAIN, FOREIGN DATA WRAPPER, FOREIGN SERVER, LANGUAGE, SCHEMA, SEQUENCE, TYPE

Yukarıda saydığımız yetkileri nesne bazlı incelemek istersek psql için aşağıdaki tablodan yararlanabiliriz;

Object Type All Privileges Default PUBLIC Privileges psql Command
DATABASE CTc Tc \l
DOMAIN U U \dD+
FUNCTION or PROCEDURE X X \df+
FOREIGN DATA WRAPPER U none \dew+
FOREIGN SERVER U none \des+
LANGUAGE U U \dL+
LARGE OBJECT rw none
SCHEMA UC none \dn+
SEQUENCE rwU none \dp
TABLE (and table-like objects) arwdDxt none \dp
Table column arwx none \dp
TABLESPACE C none \db+
TYPE U U \dT+

Şimdi bir örnek yapacak olursak aşağıdaki gibi bir tablo oluşturup, birkaç yetki verelim;

 create table table_test(id int);
GRANT SELECT ON table_test TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON table_test TO admin;
GRANT SELECT (id), UPDATE (id) ON table_test TO mustafa;

Daha sonrasında psql’de \dp komutu ile tabloya baktığımız zaman(yada aşağıdaki viewleri kullanabiliriz) yetkileri göreceğiz; Görüldüğü gibi objenin sahibi olarak postgres kullanıcısının full yetkisi(arwdDxt) var, admin kullanıcısının ise INSERT,UPDATE,DELETE (arw) yetkisi var. Sütun yetkisi olarak ise mustafa kullanıcısının id sütununda SELECT ve UPDATE(rw) yetkisi var.

 postgres=# \dp table_test
                                     Access privileges
 Schema |    Name    | Type  |     Access privileges     |   Column privileges   | Policies 
--------+------------+-------+---------------------------+-----------------------+----------
 public | table_test | table | postgres=arwdDxt/postgres+| id:                  +| 
        |            |       | =r/postgres              +|   mustafa=rw/postgres | 
        |            |       | admin=arw/postgres        |                       | 
(1 row)
 postgres=# SELECT * FROM information_schema.role_table_grants where table_name='table_test';
 grantor  | grantee  | table_catalog | table_schema | table_name | privilege_type | is_grantable | with_hierarchy 
----------+----------+---------------+--------------+------------+----------------+--------------+----------------
 postgres | postgres | postgres      | public       | table_test | INSERT         | YES          | NO
 postgres | postgres | postgres      | public       | table_test | SELECT         | YES          | YES
 postgres | postgres | postgres      | public       | table_test | UPDATE         | YES          | NO
 postgres | postgres | postgres      | public       | table_test | DELETE         | YES          | NO
 postgres | postgres | postgres      | public       | table_test | TRUNCATE       | YES          | NO
 postgres | postgres | postgres      | public       | table_test | REFERENCES     | YES          | NO
 postgres | postgres | postgres      | public       | table_test | TRIGGER        | YES          | NO
 postgres | PUBLIC   | postgres      | public       | table_test | SELECT         | NO           | YES
 postgres | admin    | postgres      | public       | table_test | INSERT         | NO           | NO
 postgres | admin    | postgres      | public       | table_test | SELECT         | NO           | YES
 postgres | admin    | postgres      | public       | table_test | UPDATE         | NO           | NO
(11 rows)
 
postgres=# SELECT * FROM information_schema.role_column_grants where table_name='table_test';
 grantor  | grantee  | table_catalog | table_schema | table_name | column_name | privilege_type | is_grantable 
----------+----------+---------------+--------------+------------+-------------+----------------+--------------
 postgres | postgres | postgres      | public       | table_test | id          | SELECT         | YES
 postgres | postgres | postgres      | public       | table_test | id          | INSERT         | YES
 postgres | postgres | postgres      | public       | table_test | id          | UPDATE         | YES
 postgres | postgres | postgres      | public       | table_test | id          | REFERENCES     | YES
 postgres | admin    | postgres      | public       | table_test | id          | UPDATE         | NO
 postgres | admin    | postgres      | public       | table_test | id          | INSERT         | NO
 postgres | admin    | postgres      | public       | table_test | id          | SELECT         | NO
 postgres | mustafa  | postgres      | public       | table_test | id          | SELECT         | NO
 postgres | mustafa  | postgres      | public       | table_test | id          | UPDATE         | NO
 postgres | PUBLIC   | postgres      | public       | table_test | id          | SELECT         | NO

Mustafa Bektaş Tepe
İyi Çalışmalar

Loading