PostgreSQL - mevcut ayrıcalıklara sahip bir kullanıcı nasıl hızlı bir şekilde bırakılır


122

Üzerinde çalıştığım uygulama için kısıtlı veritabanı kullanıcıları oluşturmaya çalışıyorum ve denemek için kullandığım Postgres veritabanı kullanıcısını bırakmak istiyorum. Öncelikle tüm haklarını manuel olarak iptal etmek zorunda kalmadan kullanıcıyı bırakmanın veya bir kullanıcının sahip olduğu tüm izinleri iptal etmenin bir yolu var mı?

Yanıtlar:


145

Ne dersin

DROP USER <username>

Bu aslında için bir takma addır DROP ROLE.

Sahipliğini başka rollere taşımak (veya nesneyi bırakmak) için o kullanıcıyla ilişkili tüm ayrıcalıkları açıkça bırakmanız gerekir.

Bu en iyi şekilde

REASSIGN OWNED BY <olduser> TO <newuser>

ve

DROP OWNED BY <olduser>

İkincisi, kullanıcıya verilen tüm ayrıcalıkları kaldıracaktır.

DROP ROLE için postgres belgelerine ve bunun daha ayrıntılı açıklamasına bakın .


İlave:

Görünüşe göre, burada bahsedilen komutları kullanarak bir kullanıcıyı bırakmaya çalışmak, yalnızca, burada tartışıldığı gibi, orijinal GRANTS'ın yapıldığı aynı veritabanına bağlıyken onları çalıştırıyorsanız işe yarayacaktır:

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local


11
Yapma: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser hata mesajları verdi: ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo. Ancak, DROP OWNED BY testuserhile yaptı, görünüşe göre Postgres hibeleri atılabilir nesneler olarak görüyor.
millimoose

1
Lütfen açıklığa kavuşturun, @Tim Kane ve millimoose: TESTUSER İÇİN GIDA SEÇİMİ VERİRSEM ve ardından TESTUSER TARAFINDAN SAHİP OLDUĞUNU DÜŞÜRÜRsem orijinal tabloların kaldırılmasını gerçekten istemiyorum. Sanırım DROP OWNED BY'ın sadece hibeleri düşürdüğünü, ancak hibenin yapıldığı nesneyi düşürmeyeceğini söylüyorsunuz. Doğru?
Andrew Wolfe

1
Andrew, açıklama için belgeleri okumak en iyisi. DROP OWNED BY , o kullanıcının sahip olduğu tabloları kaldırır . REASSIGN OWNED BY, bu tabloları farklı bir kullanıcıya yeniden atayacaktır. Birini seç.
Tim Kane

3
Hâlâ ayrıcalıklar varken REASSIGN OWNED yaptıktan sonra çok fazla para çekerek DROP OWNED konusunda endişeleniyorsanız, TÜM [TABLOLAR | SEKANSLAR | ...] ŞEMADA [şema adı] [rol]
jla

Aslında, DROP OWNED BY komutu anlamı ve etkileri açısından biraz belirsizdir. Doğru yapmak için dokümanı dikkatlice okumalıydım. Gönderiler için teşekkürler çocuklar.
Sébastien Clément

49

Kabul edilen yanıt, SAHİP OLAN veya DROP TARAFINDAN BIRAKILAN DEĞİŞTİRME girişiminde bulunduğumda hatalarla sonuçlandı. Aşağıdakiler benim için çalıştı:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;

Kullanıcı diğer şemalarda ayrıcalıklara sahip olabilir, bu durumda uygun REVOKE satırını "genel" yerine doğru şema ile değiştirerek çalıştırmanız gerekecektir. Bir kullanıcı için tüm şemaları ve ayrıcalık türlerini göstermek için, bu sorguyu yapmak için \ dp komutunu düzenledim:

SELECT 
  n.nspname as "Schema",
  CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
  END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';

Hangi ayrıcalık türlerinin TABLOLAR, SEKANSLAR veya FONKSİYONLAR'da iptal etmeye karşılık geldiğinden emin değilim, ancak hepsinin üçünden birinin altında olduğunu düşünüyorum.


12
Bunu da eklemek zorunda kaldım:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
Wojciech Jakubas

3
Ayrıca şema ayrıcalıkları.
greatvovan

2
Şema ayrıcalıkları için:revoke USAGE on SCHEMA some_schema from username;
Alphaaa

Bunu denedim ama benim durumumda sorun devam ediyor. Bunu stackoverflow.com/questions/61168608/…
Andrus,

17

Ayrıca, aşağıdakileri açıkça onayladıysanız unutmayın:

CONNECT ON DATABASE xxx TO GROUP ,

bunu kullanarak, DROP OWNED BY'dan ayrı olarak iptal etmeniz gerekecek:

REVOKE CONNECT ON DATABASE xxx FROM GROUP


Yukarıdaki her şeyi denedim ve hala benim için çalışmıyordu, biraz daha aşağı kaydırana kadar, şimdi biraz saçım kaldı. Biraz. : D teşekkür ederim !!
Mitch Kent

6

REVOKE'a bir satır daha eklemek zorunda kaldım ...

Koşu sonrası:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;

Hala hatayı alıyordum: bazı nesneler buna bağlı olduğundan kullanıcı adı bırakılamaz DETAIL: genel şema için ayrıcalıklar

Bunu özlüyordum:

REVOKE USAGE ON SCHEMA public FROM username;

Sonra rolü bırakabildim.

DROP USER username;

Örneğin, pg_rewind için pg_read_binary_file gibi işlevler üzerinde ayrıcalıklara sahip bir kullanıcı oluşturduysanız, 'SCHEMA pg_catalog' ayrıcalıklarını da iptal etmeniz gerekebilir.
GreenReaper

5

İşte nihayet benim için işe yarayan şey:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;

2

Yok REVOKE ALL PRIVILEGES ON ALL VIEWS, bu yüzden şunu bitirdim:

do $$
DECLARE r record;
begin
  for r in select * from pg_views where schemaname = 'myschem'
  loop
    execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
  end loop;
end $$;

ve her zamanki:

REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";

aşağıdakilerin başarılı olması için:

drop role "XUSER";

0

Komut satırında, dropuserkullanıcıyı postgres'ten düşürmek için kullanılabilen bir komut vardır.

$ dropuser someuser

-19

Aynı problemle karşılaştım ve şimdi çözmenin bir yolunu buldum. Öncelikle bırakmak istediğiniz kullanıcının veritabanını silmelisiniz. Daha sonra kullanıcı kolaylıkla silinebilir.

"Msf" adında bir kullanıcı oluşturdum ve kullanıcıyı silip yeniden oluşturmak için bir süre uğraştım. Aşağıdaki adımları takip ettim ve başardım.

1) Veritabanını bırakın

dropdb msf

2) kullanıcıyı bırakın

dropuser msf

Şimdi kullanıcıyı başarıyla düşürdüm.


2
Çalışmamın her yinelemesi için veritabanı şemasını yeniden oluşturmam gerekeceğinden, bu inanılmaz derecede eğik çizgi ve yakma yaklaşımıdır. (Bu, mevcut bir veritabanı şeması üzerinde ayrıntılı izinlere sahip olmayı içerir; yani, veritabanı şemasına dokunulmadan kalması en iyisidir.)
millimoose
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.