Oracle'da bir kullanıcının tüm ayrıcalıkları nasıl gösterilir?


113

Lütfen birisi bana sql konsolunda belirli bir kullanıcının tüm ayrıcalıklarını / kurallarını nasıl göstereceğimi söyleyebilir mi?

Yanıtlar:


164

Bunları aşağıdaki görünümlerde deneyebilirsiniz.

SELECT * FROM USER_SYS_PRIVS; 
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;

DBA'lar ve diğer uzman kullanıcılar, DBA_aynı görünümlerin sürümleriyle diğer kullanıcılara verilen ayrıcalıkları bulabilir . Dokümantasyon kapsamındadır .

Bu görünümler yalnızca doğrudan kullanıcıya verilen ayrıcalıkları gösterir . Rollerle dolaylı olarak verilenler de dahil olmak üzere tüm ayrıcalıkları bulmak , daha karmaşık yinelemeli SQL ifadeleri gerektirir:

select * from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER' order by 1,2,3;
select * from dba_sys_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3;
select * from dba_tab_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3,4;

21

Etrafta dolaşan ve ne kadar çılgın olmak istediğinize bağlı olarak bunu yapacak çeşitli komut dosyaları var. Ben şahsen Pete Finnigan'ın find_all_privs komut dosyasını kullanırdım .

Kendiniz yazmak istiyorsanız, sorgu oldukça zorlaşır. Kullanıcılara, içinde görünen sistem ayrıcalıkları verilebilir DBA_SYS_PRIVS. Bunlara, içinde görünen nesne ayrıcalıkları verilebilir DBA_TAB_PRIVS. Ve onlara görünür olan DBA_ROLE_PRIVSroller verilebilir (roller varsayılan olabilir veya olmayabilir ve bir parola da gerektirebilir, bu nedenle bir kullanıcıya bir rol verilmiş olması, kullanıcının mutlaka kendi ayrıcalıklarını kullanabileceği anlamına gelmez. varsayılan olarak rol aracılığıyla edinilir). Ama bu rollerin, sırayla, verilen sistem ayrıcalıkları, nesne ayrıcalıkları ve bakarak görülebilir ek rolleri olabilir ROLE_SYS_PRIVS, ROLE_TAB_PRIVSve ROLE_ROLE_PRIVS. Pete'in senaryosu, bir kullanıcıya akan tüm ayrıcalıkları göstermek için bu ilişkilerden geçer.


Senaryo harika az önce kontrol edildi
I. Tyger

1
UTL_FILE paketi için ayrıcalıklara ihtiyacınız var, yoksa Pete Finnigan'ın komut dosyasını çalıştırırken bir hata alıyorsunuz: "'UTL_FILE' tanımlayıcısı bildirilmelidir". SQL Developer aracılığıyla roll sysdba ile sys olarak bağlanabilirsiniz ve daha sonra bu pakette çalışacak veya kendinize yürütme ayrıcalıkları verecek: UTL_FILE üzerinde <user> 'ye yetkilendirme;
Jan

1
Ve SYSayrıcalıkları olmayan ve sadece kendi hesabımızın ayrıcalıklarına bakmak isteyenler için, senaryo tamamen değersizdir. Ne UTL_FILEne de DBA_SYS_PRIVSdiğerlerine DBAve SYSsenaryonun baktığı alanlara erişimim yok .
vapcguy

Sanmıyorum ROLE_SYS_PRIVS, ROLE_TAB_PRIVSve ROLE_ROLE_PRIVSihtiyaçlar incelenecek. Dokümanlar, mevcut kullanıcı için olduklarını gösteriyor .
jpmc26

Bu komut dosyalarının bir kopyası olan varsa, buraya veya bir özet gibi biraz daha yeşil bir yere gönderebilirler mi? Site kapandı.
Michael Thompson


2

İken Raviteja Vutukuri cevabı çalışmaları ve birlikte koymak hızlı, bu filtreler değişen için özellikle esnek değildir ve programlı bir şeyler yapmak arıyorsanız çok fazla yardım etmez. Bu yüzden kendi sorgumu bir araya getirdim:

SELECT
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME,
    LISTAGG(GRANT_TARGET, ',') WITHIN GROUP (ORDER BY GRANT_TARGET) AS GRANT_SOURCES, -- Lists the sources of the permission
    MAX(ADMIN_OR_GRANT_OPT) AS ADMIN_OR_GRANT_OPT, -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
    MAX(HIERARCHY_OPT) AS HIERARCHY_OPT -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
FROM (
    -- Gets all roles a user has, even inherited ones
    WITH ALL_ROLES_FOR_USER AS (
        SELECT DISTINCT CONNECT_BY_ROOT GRANTEE AS GRANTED_USER, GRANTED_ROLE
        FROM DBA_ROLE_PRIVS
        CONNECT BY GRANTEE = PRIOR GRANTED_ROLE
    )
    SELECT
        PRIVILEGE,
        OBJ_OWNER,
        OBJ_NAME,
        USERNAME,
        REPLACE(GRANT_TARGET, USERNAME, 'Direct to user') AS GRANT_TARGET,
        ADMIN_OR_GRANT_OPT,
        HIERARCHY_OPT
    FROM (
        -- System privileges granted directly to users
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- System privileges granted users through roles
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_SYS_PRIVS.GRANTEE
        UNION ALL
        -- Object privileges granted directly to users
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- Object privileges granted users through roles
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, ALL_ROLES_FOR_USER.GRANTED_ROLE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_TAB_PRIVS.GRANTEE
    ) ALL_USER_PRIVS
    -- Adjust your filter here
    WHERE USERNAME = 'USER_NAME'
) DISTINCT_USER_PRIVS
GROUP BY
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME
;

Avantajları:

  • Nesne, ayrıcalık, belirli bir rol aracılığıyla olup olmadığı vb. Gibi birçok farklı bilgi parçasına göre kolayca filtre uygulayabilirim. WHERE .
  • Bu tek bir sorgu, yani sonuçları zihinsel olarak birlikte oluşturmam gerekmiyor.
  • Ayrıcalık verip veremeyeceklerini ve ayrıcalığın farklı kaynakları arasında alt nesneler ("hiyerarşik" bölüm) için ayrıcalıkları içerip içermediği sorununu çözer.
  • Ayrıcalığın tüm kaynaklarını listelediği için, ayrıcalığı iptal etmek için yapmam gereken her şeyi görmek kolaydır.
  • Tablo ve sistem ayrıcalıklarını tek bir tutarlı görünümde birleştirerek hepsini listelememize olanak tanır. bir kullanıcının ayrıcalıklarını tek bir hamlede .
  • Bu bir sorgu , tüm bunları ortaya çıkaran bir işlev değilDBMS_OUTPUT falan (Pete Finnigan'ın bağlantılı betiğiyle karşılaştırıldığında). Bu, programatik kullanım ve dışa aktarma için kullanışlı hale getirir.
  • Filtre tekrarlanmaz; yalnızca bir kez görünür. Bu, değiştirmeyi kolaylaştırır.
  • Her bir kişi tarafından incelemeniz gerekirse, alt sorgu kolayca çıkarılabilir GRANT.

Kendim için bazı YAPILACAKLAR: 1. Kullanıcı başka bir kullanıcıya rol vererek ayrıcalık verebilirse gösterge ekleyin . 2. DBA ayrıcalıkları olmayan mevcut kullanıcı için bunu nasıl yapacağınızı öğrenin. Muhtemelen USER_SYS_PRIVS(doğrudan verilen sistem ayrıcalıkları), USER_TAB_PRIVS(doğrudan verilen nesne ayrıcalıkları) USER_ROLE_PRIVS(kullanıcıya doğrudan verilen roller), ROLE_ROLE_PRIVS(devralınan rolleri almak için), ROLE_SYS_PRIVS(roller aracılığıyla sistem ayrıcalıkları) ve ( roller aracılığıyla nesne ayrıcalıkları) içerir ROLE_TAB_PRIVS. Ugh. Oracle çok karmaşık.
jpmc26

1

Tüm kullanıcılardan tüm ayrıcalıklar listesini almak için aşağıdaki kodu kullanabilirsiniz.

select * from dba_sys_privs 

Bu, tüm ayrıcalıkları listelemez. Yıllar önce sizinkinden önce gelen diğer birkaç yanıtın da gösterdiği gibi, tablo ayrıcalıklarını ve roller aracılığıyla verilen tüm ayrıcalıkları atlar.
jpmc26

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.