Wenn Sie in PL/SQL Prozeduren, Funktionen oder Packages schreiben möchten und auf Objekte von anderen Schematas zugreifen, dann müssen Sie die dazugehörigen Rechte direkt bekommen haben und nicht über eine Rolle.
Nur stellt sich die Frage, welche Rechte habe ich direkt und welche über eine Rolle bekommen?
Das Problem löst der folgende SELECT:
SELECT * FROM (
SELECT 'Direkt' as info, privilege FROM session_privs
MINUS
SELECT 'Direkt', privilege FROM role_sys_privs)
UNION
SELECT role, privilege FROM role_sys_privs;
Die Ausgabe könnte dann z.B. so aussehen:
INFO | PRIVILEGE |
---|
Direkt | ADVISOR |
Direkt | ALTER ANY INDEX |
Direkt | ALTER ANY OUTLINE |
Direkt | ALTER DATABASE |
Direkt | ALTER SESSION |
Direkt | ALTER SYSTEM |
Direkt | ALTER TABLESPACE |
Direkt | ALTER USER |
Direkt | ANALYZE ANY |
Direkt | CREATE ANY DIRECTORY |
Direkt | CREATE ANY JOB |
Direkt | CREATE ANY OUTLINE |
Direkt | CREATE CLUSTER |
Direkt | CREATE DATABASE LINK |
Direkt | CREATE DIMENSION |
Direkt | CREATE EXTERNAL JOB |
Direkt | CREATE INDEXTYPE |
Direkt | CREATE JOB |
Direkt | CREATE MATERIALIZED VIEW |
Direkt | CREATE OPERATOR |
Direkt | CREATE PROCEDURE |
Direkt | CREATE SEQUENCE |
Direkt | CREATE SESSION |
Direkt | CREATE SYNONYM |
Direkt | CREATE TABLE |
Direkt | CREATE TRIGGER |
Direkt | CREATE TYPE |
Direkt | CREATE USER |
Direkt | CREATE VIEW |
Direkt | DROP ANY DIRECTORY |
Direkt | DROP ANY OUTLINE |
Direkt | GRANT ANY OBJECT PRIVILEGE |
Direkt | SELECT ANY DICTIONARY |
Direkt | SELECT ANY TABLE |
Oder für Objektrechte:
SELECT 'Rolle' AS INFO, role, privilege , owner, table_name
FROM role_tab_privs
UNION ALL
SELECT 'Direkt', grantee, privilege , owner, table_name
FROM user_tab_privs;
Das ist nur ein Ausschnitt unserer vielfältigen Beispiele zu Oracle Datenbanken.
Kommen Sie in einen unserer PL/SQL Kurse und Sie bekommen da eine ganze Menge mehr zu sehen ...