İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Özel Ders Başvuru Ücretsiz ön görüşme Ana Sayfa

PostgreSQL "permission denied for table" Hatası Nasıl Çözülür?

postgresql-permission-denied-for-table-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. Hata ne anlama gelir ve hangi rolle işlem yapıyorsun?
  2. Tablo yetkileri nasıl incelenir ve gereken GRANT nasıl verilir?
  3. Şema yetkisi ne zaman gerekir?
  4. Serial ve identity sütunlarda dizi yetkisi nasıl yönetilir?
  5. Yeni tablolar ve sahiplik için yetkiler nasıl düzenlenir?
  6. Sık Sorulan Sorular

PostgreSQL “permission denied for table” hatası, veritabanına bağlanan etkin rolün yapmak istediği işlem için ilgili tabloda gerekli yetkiye sahip olmadığını gösterir. Çözüm, bu role yalnızca gereken tablo yetkisini uygun bir GRANT komutuyla vermektir.

Hata ne anlama gelir ve hangi rolle işlem yapıyorsun?

Rol, veritabanında işlem yapan kimliktir; uygulamanın bağlanırken kullandığı rol, sorguları da bu kimliğin izinleriyle yürütür. Yetki, bir rolün belirli bir nesne üzerinde belirli bir işlemi yapabilme iznidir. Şema ise tabloları ve diğer veritabanı nesnelerini ad alanları içinde düzenler; public.kitaplar ifadesinde public şema, kitaplar tablodur.

Bir nesnenin sahibi, o nesne üzerindeki yetkileri yönetebilir. Bu nedenle tabloya erişemeyen uygulama rolüne yetki vermek için komutu tablo sahibi ya da gerekli yetkiyi devretme hakkı bulunan bir rol çalıştırmalıdır. PostgreSQL’in yetkiler ve nesne sahipliği açıklamaları için resmî PostgreSQL belgelerine bakabilirsin.

Önce psql oturumunda etkin rolü ve tablonun erişim yetkilerini incele:

SELECT current_user;
dp public.kitaplar

current_user, sorguların o anda hangi rolün yetkileriyle çalıştığını gösterir. dp çıktısı tablonun şemasını, adını, türünü ve erişim yetkilerini listeler. Yetki kısaltmalarında r okuma, a yeni kayıt ekleme, w mevcut satırı güncelleme iznidir. Çıktıda rol=yetkiler/rol biçimindeki bölüm, verilen yetkileri ve bunları veren rolü gösterir; ayrı bir sahiplik sütunu bulunmadığından bu satır tek başına tablonun sahibini kesin olarak belirlemez.

Tablo yetkileri nasıl incelenir ve gereken GRANT nasıl verilir?

Tablo yetkileri nasıl incelenir ve gereken GRANT nasıl verilir?

Örneğin uygulama rolü public.kitaplar tablosuna yeni kayıt eklemeye çalışsın. Ekleme sorgusunda gereken sütunların mevcut olduğunu varsayarsak hata şöyle görünür:

INSERT INTO public.kitaplar (baslik) VALUES ('Körlük');
ERROR:  permission denied for table kitaplar

Uygulamanın hangi rolü kullandığını doğrula ve tablonun yetkilerini yeniden kontrol et:

SELECT current_user;
dp public.kitaplar

current_user değerinin uygulama olduğunu doğruladıktan sonra, tablo sahibi ya da yetki verme hakkı olan rol yalnızca kayıt ekleme izni verebilir:

GRANT INSERT ON TABLE public.kitaplar TO uygulama;

INSERT tabloya yeni satır eklemeye izin verir. Uygulamanın tablodaki kayıtları okuması gerekiyorsa ayrıca SELECT ver:

GRANT SELECT ON TABLE public.kitaplar TO uygulama;

Mevcut satırların değiştirilmesi gerekiyorsa UPDATE yetkisini ayrı olarak ekle:

GRANT UPDATE ON TABLE public.kitaplar TO uygulama;

Yetki seçimini uygulamanın gerçek gereksinimine göre yap: kayıtları okumak için SELECT, yeni kayıt eklemek için INSERT, mevcut satırları değiştirmek için UPDATE. Bazı güncelleme sorguları, satırları seçmek ya da sütun değerlerini okumak için SELECT yetkisine de ihtiyaç duyabilir. Bu komutların kullanımı PostgreSQL GRANT belgelerinde açıklanır.

Uygulama rolüne ALL PRIVILEGES vermek, istenen iş için gerekmeyen tablo işlemlerine de izin açabilir. SUPERUSER rolü ise veritabanı genelinde çok geniş yetkilere sahiptir; uygulama bağlantısı için kullanılması en az yetki ilkesine uymaz. Uygulamanın yapması gereken işlemlere karşılık gelen yetkileri ayrı ayrı vermek, erişimi gerekli kapsamda tutar.

Şema yetkisi ne zaman gerekir?

Şema yetkisi ne zaman gerekir?

Bir tabloya erişebilmek için tablo üzerindeki işlem izninin yanında, o tablonun bulunduğu şemaya erişim sağlayan USAGE yetkisi de gerekebilir. Rol, veritabanında işlem yapan kullanıcı kimliğidir; şema ise tabloları ve diğer veritabanı nesnelerini ad alanları içinde düzenler. USAGE, rolün şema içindeki nesnelere erişebilmesini sağlar. Tablo üzerindeki SELECT, INSERT ve UPDATE izinlerinin yerine geçmez.

Örneğin uygulama rolünün public.kitaplar tablosuna erişmesi gerekiyor, ancak şemada USAGE yetkisi bulunmuyorsa yetkiyi tablo izninden ayrı ver:

GRANT USAGE ON SCHEMA public TO uygulama;

Bu yetki, şemada yeni nesne oluşturma izni vermez. Nesne oluşturmak için ayrıca CREATE gerekir. PostgreSQL 15’te public şemasına ilişkin varsayılan CREATE değişikliği yeni veritabanı kümelerine ve mevcut kümelerde yeni oluşturulan veritabanlarına uygulanır; yükseltilen kümelerde veya dökümden geri yüklenen veritabanlarında mevcut izinler korunabilir. Bu nedenle izni varsaymak yerine PostgreSQL’in şema ve izin belgelerini inceleyip kendi veritabanındaki durumu psql içinde dn+ public komutuyla kontrol et.

Serial ve identity sütunlarda dizi yetkisi nasıl yönetilir?

Tabloya INSERT izni verilmiş olsa bile, serial sütunun otomatik değer üreten dizisine gereken izin yoksa ekleme sırasında sequence yetkisi hatası alınabilir. Sequence, artan değer üreten veritabanı nesnesidir. Örneğin public.kitaplar tablosundaki id serial sütununun dizisi çoğunlukla public.kitaplar_id_seq adını taşır. Hata bu dizi için izin gerektiğini gösteriyorsa USAGE ver:

GRANT USAGE ON SEQUENCE public.kitaplar_id_seq TO uygulama;

Bu izin, dizi üzerinden nextval ve currval çağrılarına olanak tanır. nextval sıradaki değeri alır; currval oturumda en son alınan değeri döndürür. setval dizinin değerini değiştirdiğinden UPDATE izni gerektirir. Sıradan kayıt ekleme için setval yetkisi vermek gerekmez. Ayrıntılar PostgreSQL 15 sequence işlevleri belgesinde açıklanır.

GENERATED ALWAYS AS IDENTITY veya GENERATED BY DEFAULT AS IDENTITY sütunu da otomatik değer üretmek için kendisine bağlı bir sequence kullanır. Identity sütununda değerin otomatik üretildiği sıradan bir INSERT işlemi için tablo üzerindeki INSERT izni gerekir; sequence işlevlerini ayrıca doğrudan çağıran sorgular ise kendi sequence izinlerine tabidir. Yetki verirken yalnızca hata veren işlem için gereken izni tanımla.

Yeni tablolar ve sahiplik için yetkiler nasıl düzenlenir?

Yeni tablolara otomatik yetki vermek için ALTER DEFAULT PRIVILEGES kullanabilirsin. Rol, veritabanında işlemleri gerçekleştiren kimliktir; sahiplik ise bir nesnenin yönetim yetkilerinin hangi role ait olduğunu belirler. Şema, tabloları ve diğer nesneleri adları altında düzenleyen alandır. Varsayılan yetkiler, tabloyu oluşturan rol için ayarlanmalıdır; bu ayarın kapsamı ve rol davranışı PostgreSQL belgelerinde açıklanır.

ALTER DEFAULT PRIVILEGES FOR ROLE kitap_sahibi IN SCHEMA public
GRANT SELECT, INSERT, UPDATE ON TABLES TO uygulama;

Bu komut, public şemasında bundan sonra kitap_sahibi rolüyle oluşturulacak tablolara uygulama rolü için belirtilen yetkileri tanımlar. Mevcut tablolara geriye dönük olarak yetki vermez. Ayrıca bir rolün üyeliği, o rol için tanımlanan varsayılan yetkilerin tabloyu oluşturan başka bir role kendiliğinden uygulanacağı anlamına gelmez. Tabloları hangi rolle oluşturduğunu ve varsayılan yetki komutunu hangi rol adına ayarladığını birlikte kontrol et.

Hata mevcut bir tabloda sürüyorsa psql içinde dt public.kitaplar komutuyla tablonun sahibini incele. Sahiplik uygulama rolünden farklıysa, çoğu erişim ihtiyacında tabloyu devretmek yerine gerçek sahibinden gereken yetkileri vermesini iste:

GRANT SELECT, INSERT, UPDATE ON TABLE public.kitaplar TO uygulama;

Uygulama rolüne SUPERUSER ya da gelişigüzel ALL PRIVILEGES vermek yerine yalnızca uygulamanın ihtiyaç duyduğu işlemleri tanımla. Sık atlanan diğer noktalar, tabloyu oluşturan rolün varsayılan yetkilerini gözden kaçırmak ve tablo yetkileri verilmiş olsa bile şema erişimi için gereken USAGE yetkisini kontrol etmemektir.

Sık Sorulan Sorular

PostgreSQL'de permission denied for table hatasını çözmek için GRANT ALL PRIVILEGES vermek güvenli midir?

GRANT ALL PRIVILEGES tablo için tanımlı tüm yetkileri verir; uygulamanın ihtiyacı olmayan işlemlere de izin tanıyabileceğinden genellikle en dar gerekli yetkileri ayrı ayrı vermek daha uygundur. Uygulama rolü SUPERUSER olmamalıdır.

ALTER DEFAULT PRIVILEGES komutu mevcut tablolara da yetki verir mi?

ALTER DEFAULT PRIVILEGES yalnızca ilgili rolün gelecekte oluşturacağı nesnelere uygulanır; mevcut tablolardaki yetkileri değiştirmez.

INSERT yetkisi olduğu hâlde serial sütununda sequence yetki hatası neden alınır?

serial sütununun kullandığı dizi ayrı bir nesnedir ve tabloya INSERT yetkisi verilmesi diziye erişim yetkisi sağlamaz. Ekleme işleminin ürettiği hata sürüyorsa ilgili dizinin adını bulup uygulama rolüne gereken dizi yetkisini, çoğunlukla USAGE, ayrıca ver.

Yetki hatasını incelerken bağlantıda kullanılan rolü, tablonun sahibini ve tablo, şema ve gerekiyorsa dizi yetkilerini birlikte kontrol et.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara