Bir kullanıcı için tüm tablolara erişim izni verme


151

Postgres'te yeniyim ve MySQL veritabanlarımızı taşımaya çalışıyorum. MySQL ben verebilir SELECT, UPDATE, INSERTve DELETEdüşük ayrıcalıklı kullanıcı ayrıcalıkları ve belirli bir veritabanındaki tüm tabloları için geçerli olan hibe sağlayacak. Postgres'te bir şey eksik olmalı, çünkü her masa için bu ayrıcalıkları birer birer vermem gerekiyor gibi görünüyor. Birçok veritabanında ve veritabanı başına yüzlerce tablo ile sadece yerden almak korkutucu bir görev gibi görünüyor. Ek olarak, bir veritabanı işletime alındıktan sonra, tabloların eklenmesi, kesinlikle gerekmedikçe her seferinde izin vermek zorunda kalmamam için yeterli sıklıkta olur.

Bu en iyi nasıl başarılır?

Yanıtlar:


175

İlk olarak, sorguları çalıştırmak için veritabanına bağlanabilmeniz gerekir. Bu elde edilebilir

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;

REVOKEGerekli çünkü

PUBLIC anahtar sözcüğü, ayrıcalıkların daha sonra yaratılabilecekler dahil olmak üzere tüm rollere verileceğini belirtir. KAMU, her zaman tüm rolleri içeren, dolaylı olarak tanımlanmış bir grup olarak düşünülebilir. Herhangi bir özel rol, doğrudan kendisine verilen ayrıcalıklara, şu anda üyesi olduğu herhangi bir rol için verilen ayrıcalıklara ve KAMU'ya verilen ayrıcalıklara sahip olacaktır.

Kullanıcınızı gerçekten DML ifadeleriyle sınırlandırmak istiyorsanız, yapmanız gereken daha çok şey var:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;

Bunlar, yalnızca bir şemaya sahip olduğunuzu varsayar (varsayılan olarak 'genel' olarak adlandırılır).

Jack Douglas'ın belirttiği gibi, yukarıdakiler yalnızca mevcut tablolar için ayrıcalıklar verir . Gelecekteki tablolarda da aynısını elde etmek için varsayılan ayrıcalıkları tanımlamanız gerekir :

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

Burada, some_roletabloları yaratan user_name, ayrıcalıklara sahip olan bir roldür . Bunu tanımlayarak, some_rolebir üye veya üye olarak giriş yapmış olmanız gerekir .

Ve son olarak, diziler için aynısını yapmanız gerekir (işaret etmek için PlaidFan sayesinde) - işte USAGEihtiyacınız olan ayrıcalık.


1
Teşekkürler, FOR some_roledaha sonra yarattığım tablolarda çalışmasını sağlamak için eksik olduğum ana kısım buydu. Ancak some_role, varsayılan yönetici postgreskullanıcısı olarak sorguyu uyguladıysam, oturum açmam gerekmedi .
JustAMartin,

54

tüm ayrıcalıkları vermek istediğinizi varsayalım - şunu yapın:

grant all privileges on database dbname to dbuser;

dbnameveritabanınızın dbuseradı ve kullanıcının adı nerede .


44
Bu şu ayrıcalıkları katacak veritabanı : CREATE, CONNECT, TEMPORARY. Masalarda imtiyaz yok.
dezso

13
Tüm tablolar için benzer bir komut olacaktır,GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci 28.03.2017

5
Bunu da faydalı buldum:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Paolo

18

Veritabanındaki tüm tablolara tüm imtiyazların verilmesi

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;

15

PostgreSQL konusunda çok yeni olduğum için burada yanlış bir şey yapıyordum. Ancak bu sadece benim için problemin ilk kısmını çözdü - mevcut tüm tablolarda ayrıcalıkları belirlemek.

Kullanıcılarım için yeni tablolarda izinlerin doğru bir şekilde ayarlanması için oluşturulan, kullanıcı için varsayılan izinleri belirlemeliyim:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;

2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.