PostgreSQL rolüne bağlı nesneleri bulma


13

Bazı zamanlar önce user1 (PostgreSQL 9.4.9) adlı bir PostgreSQL kullanıcısı oluşturdum .

Bu kullanıcıyı bırakmak istiyorum. Bu yüzden ilk önce tablolar, sıralar, işlevler, varsayılan ayrıcalıklar ve sahiplik üzerindeki tüm izinleri iptal ediyorum:

ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON SEQUENCES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM user1;

REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM user1;

REASSIGN OWNED BY user1 TO postgres;

Bununla birlikte, bir nesnenin 2 veritabanında bu kullanıcıya bağlı kaldığı görülmektedir:

postgres=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  1 object in database db1
1 object in database db2

Hatta bir işlev gibi görünüyor:

postgres=# \c db1
You are now connected to database "db1" as user "postgres".
db1=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  privileges for function text(boolean)
1 object in database db2

Ancak hangi nesnenin user1'e ait olduğunu veya user1 ile ilişkili olduğunu belirleyemiyorum.

Ben ise pg_dump -s db1 | grep user1hiçbir sonuç elde! Küresel bir nesne olabilir mi?

Eksik nesneyi nasıl tanımlayabilirim?

Her veritabanı (db1 ve db2) komutları yürüttüm. Sahip olunan nesneleri bırakmak istemiyorum user1, sadece bu kullanıcı için hibeleri yeniden atamak veya kaldırmak istiyorum.

Yanıtlar:


10

Sorulan soruya cevap

Hata iletisindeki ve sahibindeki işlevi aramak için:

SELECT oid::regprocedure AS function
     , pg_get_userbyid(proowner) AS owner
FROM   pg_proc
WHERE  oid = 'text(boolean)'::regprocedure;

İlişkili:

Gerçek sorun

Hata mesajı şunu söylüyor:

DETAY: işlev metni ayrıcalıkları (boole)

O var değil sahipliği konusunda ama yaklaşık ayrıcalıkları .

Kullanım kılavuzu DROP ROLE:

Rolü bırakmadan önce, sahip olduğu tüm nesneleri bırakmanız (veya sahipliklerini yeniden atamanız) ve rolün diğer nesneler üzerinde verdiği ayrıcalıkları iptal etmeniz gerekir .

Ve için ALTER DEFAULT PRIVILEGES:

Varsayılan ayrıcalıkları değiştirilmiş olan bir rol düşmesi isterseniz, varsayılan ayrıcalıkları veya kullanım değişiklikleri tersine çevirmek için gerekli olan DROP OWNEDkadar BY rol için varsayılan ayrıcalıkları girişi kurtulmak .

Ayrıca yalnızca REASSIGN OWNEDbir DB'de yürüttüğünüz gibi görünüyor , ancak kılavuz şu talimatları veriyor :

Çünkü REASSIGN OWNEDdiğer veritabanları içindeki nesneleri etkilemez, genellikle gerekli her veritabanında bu komutu çalıştırmak kaldırılacak olan bir role sahip olduğu nesneler içeriyor.

Cesur vurgu benim.

Ve emirlerinizi kısıtladınız IN SCHEMA public. Tüm DB'yi hedeflemek için bu maddeyi bırakın. Ama rahatsız etme, bir ...

İle basit çözüm DROP OWNED

REASSIGN OWNED BY user1 TO postgres;
DROP OWNED BY user1;

Tüm rolün nesneleri postgresilk komutla sahipliğini değiştirdi ve şimdi güvendeler. Tüm ifadelerden DROP OWNEDve varsayılan ayrıcalıklardan da kurtulduğu için ifadesi biraz yanıltıcıdır. Kullanım kılavuzu DROP OWNED:

DROP OWNEDgeçerli veritabanındaki belirtilen rollerden birine ait olan tüm nesneleri bırakır. Geçerli veritabanındaki nesnelerde ve paylaşılan nesnelerde (veritabanları, tablo alanları) verilen rollere verilen tüm ayrıcalıklar da iptal edilir.

İlgili tüm DB'lerde tekrarlayın, ardından öldürmeye geçebilirsiniz:

DROP ROLE user1;

7

Aşağıdaki sorgu sahiplerine sahip nesneleri listeler. Tüm ayrıcalıklar için aslında daha fazlasına ihtiyacımız var.

--r = ordinary table, i = index, S = sequence, v = view, m = materialized view, c = composite type, t = TOAST table, f = foreign table
SELECT 
    n.nspname AS schema_name,
    c.relname AS rel_name,
    c.relkind AS rel_kind,
    pg_get_userbyid(c.relowner) AS owner_name
  FROM pg_class c
  JOIN pg_namespace n ON n.oid = c.relnamespace

UNION ALL

-- functions (or procedures)
SELECT
    n.nspname AS schema_name,
    p.proname,
    'p',
    pg_get_userbyid(p.proowner)
  FROM pg_proc p
  JOIN pg_namespace n ON n.oid = p.pronamespace

Hala eksik nesneyi bulamıyorum.
Nicolas Payart

@NicolasPayart: Sorguyu doğru veritabanında mı yürütüyorsunuz?
Erwin Brandstetter

1

Önce veritabanına bağlanmanız gerekir. Sizin örneğinizde bu

\c db1

ve

\c db2

Sonra TÜM AYRICA İPTAL ET ve YENİDEN YAPILMIŞ / SAHİP OLDU ifadelerini tekrar çalıştırmayı deneyin.


1
Hey, ilk cevabın için teşekkürler. Ancak, göndermeden önce lütfen bunun mevcut cevaplara neleri eklediğini düşünün ve bunu cevabınızda da açıklayın.
dezso
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.