Bu konuda iyi bir rehber, eğitim veya video dizisini nerede bulabilirim?
Her şeyi kılavuzda bulacaksınız . Aşağıdaki linkler.
Verilen, önemsiz ve bazen kafa karıştırıcı değil. İşte kullanım durum için bir reçete:
Yemek tarifi
Yapılandırılmasını istiyorum, böylece sadece hostdb_admin
tablolar oluşturabilir (ve bırakıp değiştirebilir); okuma, güncelleme yerleştirin ve varsayılan olarak tüm tabloları silebilirsiniz;
ve yalnızca tüm tabloları (ve görünümleri) okuyabilir.
hostdb_mgr
hostdb_usr
Süper kullanıcı olarak postgres
:
CREATE USER schma_admin WITH PASSWORD 'youwish';
-- CREATE USER schma_admin WITH PASSWORD 'youwish' CREATEDB CREATEROLE; -- see below
CREATE USER schma_mgr WITH PASSWORD 'youwish2';
CREATE USER schma_usr WITH PASSWORD 'youwish3';
Veritabanlarını ve rollerini de yönetebilen daha güçlü bir yönetici istiyorsanız, rol niteliklerini CREATEDB
veCREATEROLE
üstünü ekleyin .
Her bir rolü bir üst seviyeye verin, böylece tüm seviyeler en azından bir sonraki alt seviyeden ayrılan ayrıcalıkları “miras” altına alın (kademeli):
GRANT schma_usr TO schma_mgr;
GRANT schma_mgr TO schma_admin;
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public; -- see notes below!
GRANT CONNECT ON DATABASE hostdb TO schma_usr; -- others inherit
\connect hostdb -- psql syntax
Şemayı adlandırıyorum schma
( hostdb
kafa karıştırıcı olmaz). Herhangi bir isim seç. İsteğe bağlı olarak yapmak schma_admin
şemanın sahibi:
CREATE SCHEMA schma AUTHORIZATION schma_admin;
SET search_path = schma; -- see notes
ALTER ROLE schma_admin IN DATABASE hostdb SET search_path = schma; -- not inherited
ALTER ROLE schma_mgr IN DATABASE hostdb SET search_path = schma;
ALTER ROLE schma_usr IN DATABASE hostdb SET search_path = schma;
GRANT USAGE ON SCHEMA schma TO schma_usr;
GRANT CREATE ON SCHEMA schma TO schma_admin;
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT SELECT ON TABLES TO schma_usr; -- only read
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO schma_mgr; -- + write, TRUNCATE optional
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO schma_mgr; -- SELECT, UPDATE are optional
and drop and alter
Aşağıdaki notları görmek için .
İşler daha da geliştikçe TRIGGERS
, benzer kısıtlamaları , saklı yordamları VIEWS
ve belki de diğer nesneleri uygulamak için de sorularım olacak .
... (ancak ALL TABLES
görüş ve yabancı tabloları içerdiği kabul edilir).
Ve Güncellenebilir Görünümler için :
Görünümde ekleme, güncelleme veya silme işlemini gerçekleştiren kullanıcının görünümde ilgili ekleme, güncelleme veya silme ayrıcalığına sahip olması gerektiğini unutmayın. Ek olarak, görünümün sahibi, temel dayanak ilişkileri üzerinde ilgili imtiyazlara sahip olmalıdır, ancak güncellemeyi yapan kullanıcının temel dayanak ilişkileri üzerinde herhangi bir izne ihtiyacı yoktur (bkz.
Bölüm 38.5 ).
Tetikleyiciler de özeldir. TRIGGER
Masadaki ayrıcalığa ihtiyacınız var ve:
Ama biz zaten bu sorunun kapsamını genişletiyoruz ...
Önemli notlar
sahiplik
İzin vermek isterseniz schma_admin
bırakın ve alter tablolar, rol yapma (tek başına) sahip tüm nesneleri. Dökümantasyon:
Bir nesneyi düşürme veya tanımını herhangi bir şekilde değiştirme hakkı, bir büyütülebilir imtiyaz olarak değerlendirilmez; mal sahibine özgüdür ve verilemez veya iptal edilemez. (Bununla birlikte, benzer bir etki, nesnenin sahibi olduğu rolde üyeliğin verilmesi veya iptal edilmesiyle elde edilebilir; aşağıya bakın.) Sahip, dolaylı olarak nesne için de tüm hibe seçeneklerine sahiptir.
ALTER TABLE some_tbl OWNER TO schma_admin;
Ya daschma_admin
başlamasıgereken rolle birlikte tüm nesneleri oluşturun, ardından sahibi açıkça ayarlamanız gerekmez. Ayrıca, daha sonra yalnızca bir rol için ayarlamanız gereken varsayılan ayrıcalıkları da basitleştirir:
Önceden var olan nesneler
Varsayılan ayrıcalıklar, yalnızca yeni oluşturulan nesneler için ve yalnızca birlikte oluşturdukları belirli rol için geçerlidir. Siz de mevcut nesneler için izinleri uyarlamak isteyeceksiniz :
Aynısı DEFAULT PRIVILEGES
, süper kullanıcı gibi ayarlanmamış bir rolü olan nesneler oluşturursanız da geçerlidir postgres
. Yeniden atama sahiplik schma_admin
elle ve seti ayrıcalıkları - veya set DEFAULT PRIVILEGES
için postgres
de (sağ DB bağlıyken!):
ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ... -- etc.
Varsayılan ayrıcalıklar
ALTER DEFAULT PRIVILEGES
Komutun önemli bir yönünü özlüyordun. Aksi belirtilmedikçe mevcut rol için geçerlidir:
Varsayılan ayrıcalıklar yalnızca mevcut veritabanına uygulanır. Böylece DB kümesindeki diğer veritabanlarıyla uğraşmazsınız. Dökümantasyon:
Geçerli veritabanında oluşturulan tüm nesneler için
Sen olabilir ayrıca ayarlanan varsayılan ayrıcalıkları için istediğiniz FUNCTIONS
ve TYPES
(sadece TABLES
ve SEQUENCES
), ancak bu gerekli olmayabilir.
İçin varsayılan ayrıcalıklar PUBLIC
Verilen varsayılan imtiyazlar PUBLIC
temeldir ve bazıları tarafından fazla tahmin edilir. Dökümantasyon:
PostgreSQL bazı nesneler için varsayılan ayrıcalıklar verir
PUBLIC
. Tablolarda, sütunlarda, şemalarda veya tablo alanlarında varsayılan olarak hiçbir ayrıcalık verilmez PUBLIC
. Diğer türler için verilen varsayılan ayrıcalıklar PUBLIC
aşağıdaki gibidir: CONNECT
ve CREATE TEMP TABLE
veritabanları için; EXECUTE
işlevler için ayrıcalık; ve USAGE
diller için ayrıcalık.
Cesur vurgu benim. genellikle yukarıdaki bir komut her şeyi kapsayacak şekilde yeterlidir:
REVOKE ALL ON DATABASE hostdb FROM public;
Özellikle, PUBLIC
yeni şemalar için varsayılan ayrıcalıklar verilmez . "Public" adlı varsayılan şemanın ALL
için ayrıcalıklarla başlaması kafa karıştırıcı olabilir PUBLIC
. Bu sadece yeni oluşturulan veritabanları ile başlangıcı kolaylaştırmak için kolaylık sağlayan bir özelliktir. Diğer şemaları hiçbir şekilde etkilemez. Sen edebilirsiniz Şablon veritabanında bu ayrıcalıkları iptal template1
sonra bu kümedeki tüm yeni oluşturulan veritabanları onlarsız başlar:
\connect template1
REVOKE ALL ON SCHEMA public FROM public;
Ayrıcalık TEMP
Tüm ayrıcalıkları iptal ettiğimiz hostdb
için PUBLIC
, düzenli olarak izin vermediğimiz sürece normal kullanıcılar geçici tablolar oluşturamazlar. Bunu eklemek isteyebilir veya istemeyebilirsiniz:
GRANT TEMP ON DATABASE hostdb TO schma_mgr;
search_path
Ayarlamayı unutma search_path
. Kümede yalnızca bir veritabanı varsa, genel varsayılanı sadece ayarlayabilirsiniz postgresql.conf
. Başka (daha muhtemel), veritabanının özelliği olarak veya yalnızca ilgili roller ve hatta ikisinin birleşimi için ayarlayın. Detaylar:
schma, public
Genel şemayı da kullanıyorsanız, belki de (daha az olasılıkla) kullanmak isteyebilirsiniz $user, schma, public
...
Bir alternatif, search_path
siz değiştirmediğiniz sürece varsayılan ayarlarla çalışması gereken "public" varsayılan şemasını kullanmak olacaktır . PUBLIC
Bu durumda ayrıcalıkları iptal etmeyi unutmayın .
İlgili
public
sözde yatıyor) . Diğer her rolün (kullanıcı, grup - bunların hepsi aynı) bir üyesi olduğu düşünülebilir. Örneğin, ayrıcalıkları silmeyi deneyinREVOKE CREATE ON SCHEMA hostdb FROM public
. Veri tabanı düzeyindeki hakları iptal etmek, sizin yaptığınız gibi, yalnızca bazı veri tabanı izinlerini devre dışı bırakır, şemalar veya tablolar üzerinde etkisi yoktur.