Bir Oracle DB'de tüm hibeleri görmem gerekiyor.
Şemaları karşılaştırmak için TOAD özelliğini kullandım ancak cazip bağışlar vb. Göstermiyor, bu yüzden sorum var:
Bir Oracle DB'deki tüm hibeleri nasıl listeleyebilirim?
Yanıtlar:
Doğrudan tablo hibelerinden daha fazlasını istiyorsanız (örneğin, roller aracılığıyla verilen hibe, herhangi bir tabloyu seçme gibi sistem ayrıcalıkları vb.), İşte bazı ek sorgular:
Bir kullanıcı için sistem ayrıcalıkları:
SELECT PRIVILEGE
FROM sys.dba_sys_privs
WHERE grantee = <theUser>
UNION
SELECT PRIVILEGE
FROM dba_role_privs rp JOIN role_sys_privs rsp ON (rp.granted_role = rsp.role)
WHERE rp.grantee = <theUser>
ORDER BY 1;
Tablolara / görünümlere doğrudan bağışlar:
SELECT owner, table_name, select_priv, insert_priv, delete_priv, update_priv, references_priv, alter_priv, index_priv
FROM table_privileges
WHERE grantee = <theUser>
ORDER BY owner, table_name;
Tablolara / görünümlere dolaylı hibeler:
SELECT DISTINCT owner, table_name, PRIVILEGE
FROM dba_role_privs rp JOIN role_tab_privs rtp ON (rp.granted_role = rtp.role)
WHERE rp.grantee = <theUser>
ORDER BY owner, table_name;
role_role_privs
Masaya ayrıldıktan sonra CONNECT BY PRIOR granted_role = role
geçiş rolü ayrıcalıklarına tekrar dönmek ilginç olurdu ...
Üzgünüm çocuklar, ancak Grantee = 'kullanıcınız' olan all_tab_privs_recd arasından seçim yapmak, seçimi farklı bir kullanıcıdan (örneğin SYS) çalıştırırsanız, genel bağışlar ve mevcut kullanıcı izinleri dışında herhangi bir çıktı vermeyecektir. Belgelerin dediği gibi,
ALL_TAB_PRIVS_RECD, aşağıdaki hibe türlerini açıklar:
Object grants for which the current user is the grantee Object grants for which an enabled role or PUBLIC is the grantee
Dolayısıyla, bir DBA iseniz ve belirli bir kullanıcı için (SYS'nin kendisi değil) tüm nesne izinlerini listelemek istiyorsanız, bu sistem görünümünü kullanamazsınız.
Bu durumda, daha karmaşık bir sorgu gerçekleştirmelisiniz. İşte belirli bir kullanıcı için tüm nesne hibelerini seçmek için TOAD'dan alınan (izlenen):
select tpm.name privilege,
decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
ue.name grantee,
ur.name grantor,
u.name owner,
decode(o.TYPE#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
11, 'PACKAGE BODY', 12, 'TRIGGER',
13, 'TYPE', 14, 'TYPE BODY',
19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB',
22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE',
28, 'JAVA SOURCE', 29, 'JAVA CLASS', 30, 'JAVA RESOURCE',
32, 'INDEXTYPE', 33, 'OPERATOR',
34, 'TABLE SUBPARTITION', 35, 'INDEX SUBPARTITION',
40, 'LOB PARTITION', 41, 'LOB SUBPARTITION',
42, 'MATERIALIZED VIEW',
43, 'DIMENSION',
44, 'CONTEXT', 46, 'RULE SET', 47, 'RESOURCE PLAN',
66, 'JOB', 67, 'PROGRAM', 74, 'SCHEDULE',
48, 'CONSUMER GROUP',
51, 'SUBSCRIPTION', 52, 'LOCATION',
55, 'XML SCHEMA', 56, 'JAVA DATA',
57, 'EDITION', 59, 'RULE',
62, 'EVALUATION CONTEXT',
'UNDEFINED') object_type,
o.name object_name,
'' column_name
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
table_privilege_map tpm
where oa.obj# = o.obj#
and oa.grantor# = ur.user#
and oa.grantee# = ue.user#
and oa.col# is null
and oa.privilege# = tpm.privilege
and u.user# = o.owner#
and o.TYPE# in (2, 4, 6, 9, 7, 8, 42, 23, 22, 13, 33, 32, 66, 67, 74, 57)
and ue.name = 'your user'
and bitand (o.flags, 128) = 0
union all -- column level grants
select tpm.name privilege,
decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
ue.name grantee,
ur.name grantor,
u.name owner,
decode(o.TYPE#, 2, 'TABLE', 4, 'VIEW', 42, 'MATERIALIZED VIEW') object_type,
o.name object_name,
c.name column_name
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
sys.col$ c, table_privilege_map tpm
where oa.obj# = o.obj#
and oa.grantor# = ur.user#
and oa.grantee# = ue.user#
and oa.obj# = c.obj#
and oa.col# = c.col#
and bitand(c.property, 32) = 0 /* not hidden column */
and oa.col# is not null
and oa.privilege# = tpm.privilege
and u.user# = o.owner#
and o.TYPE# in (2, 4, 42)
and ue.name = 'your user'
and bitand (o.flags, 128) = 0;
Bu, (belirtilen) kullanıcınız için tüm nesne izinlerini (sütun izinleri dahil) listeleyecektir. Sütun düzeyinde hibe istemiyorsanız, seçimin 'birleşim' ifadesiyle başlayan tüm parçalarını silin.
UPD: Belgeleri incelerken, tüm hibeleri çok daha basit bir şekilde listeleyen başka bir görünüm buldum:
select * from DBA_TAB_PRIVS where grantee = 'your user';
Akılda Ayı var ki hiçbir Oracle'da DBA_TAB_PRIVS_RECD görünümü.
Bildiğim en kapsamlı ve güvenilir yöntem hala DBMS_METADATA kullanmak :
select dbms_metadata.get_granted_ddl( 'SYSTEM_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'OBJECT_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'ROLE_GRANT', :username ) from dual;
Yine de ilginç cevaplar.
select distinct 'GRANT '||privilege||' ON '||OWNER||'.'||TABLE_NAME||' TO '||RP.GRANTEE
from DBA_ROLE_PRIVS RP join ROLE_TAB_PRIVS RTP
on (RP.GRANTED_ROLE = RTP.role)
where (OWNER in ('YOUR USER') --Change User Name
OR RP.GRANTEE in ('YOUR USER')) --Change User Name
and RP.GRANTEE not in ('SYS', 'SYSTEM')
;
Aşağıdaki sorgu, bir kullanıcının tüm ayrıcalıklarını elde etmek için kullanılabilir .. İlk sorguda kullanıcı adını girmeniz yeterlidir ve bunun için tüm ayrıcalıklara sahip olursunuz.
KULLANICILARLA (dual'den 'SCHEMA_USER' usr'U SEÇİN), Roles AS (dba_role_privs ÜZERİNDEN KULLANICI SEÇİN Rp.GRANTEE = users.usr ÜNİTE SEÇİMİNE VERİLEN UNION SELECT given_role role_role_privs NEREDEN (dba_role_privs'DEN SEÇİN izin verilen_role) Rp ÜZERİNDE KATILIN kullanıcılarla. GRANTEE = users.usr)), tab_privilage AS (SAHİBİ SEÇ, TABLE_NAME, role_tab_privs'DEN ÖZEL, rtp.role = r.granted_role BİRLEŞME SEÇİM SAHİBİ, TABLE_NAME, ÖZEL KULLANICILAR Dba_Tab_Privs dtp ÜZERİNDE KATIL Kullanıcıları dtp. usr), sys_privileges AS (dba_sys_privs'DEN SEÇİN ayrıcalık dsp dsp.grantee = users.usr ÜZERİNDEN kullanıcıları SEÇ) SEÇ * tab_privilage SİPARİŞ Sahibine göre, tablo_adı - sys_privileges'DEN SEÇ *