Erläuterung des Definitionsparameter AUTHID bei Prozeduren in Oracle Database

Ich habe letztens auf einer Oracle 10.2.0.5 Datenbank mit Prozeduren rumgespielt. Konkret habe ich eine gebraucht, die mir den Audit-Trail der durch den Parameter audit_trail=db,extended entstanden ist, mal wieder aus der Datenbank löscht. Diese Prozedur sollte mit SYSTEM ausgeführt werden. Mein erster Versuch der Prozedur sah wie folgt aus: 1 2 3 4 5 6 7 8 9 CREATE OR REPLACE PROCEDURE PURGE_AUDIT_TRAIL (days in number) as purge_date date; BEGIN purge_date := trunc(sysdate-days); DBMS_OUTPUT.PUT_LINE('AUDIT: Purging Audit Trail until ' || purge_date || ' started'); EXECUTE IMMEDIATE 'delete from sys.aud$ where ntimestamp# < trunc(sysdate- ' || days || ')'; commit; DBMS_OUTPUT.PUT_LINE('AUDIT: Purging Audit Trail until ' || purge_date || ' has completed'); END; / Bei der Ausführung durch SYS war alles in Ordnung (egal, ob die Prozedur unter SYS oder SYSTEM eingebaut wurde), bei Ausführung unter SYSTEM konnte AUD$ nicht gefunden werden. Dubioserweise konnte aber per SELECT in der gleichen Prozedur drauf zugegriffen werden. ...

Abfangen von ORA- Fehlermeldungen in PL/SQL-Blöcken

Gestern habe ich einen PL/SQL-Code für eine Oracle Datenbank geschrieben, wo allen Nutzern Rechte entzogen werden sollten. Problem war, dass nicht jeder Nutzer diese Rechte überhaupt hatte und daher der Fehler “ORA-01927: cannot REVOKE privileges you did not grant” geworfen wurde. Untenstehend habe ich lediglich ein paar Beispiele gezeigt, wie man das abfängt. Mein erster Ansatz war, diesen im generischen Exception-Block abzufangen: 1 2 3 4 5 6 7 BEGIN -- Placeholder for revoke the rights from USER DBMS_OUTPUT.PUT_LINE('[X] ' || USER || ';'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('[ ] ' || USER || ';'); END; Wenn das revoken klappt, dann wird “[X] Username” ausgegeben, wenn nicht, dann eben “[ ] Username”. Dies führt aber dazu, dass man nicht unterscheiden kann, ob ein Fehler aufgetreten ist oder ob der Nutzer nicht einfach schon ohne diese Rechte existiert hatte. Daher muss man sich eine Exception basteln: ...