Oracle Logo

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.

Hintergrund des ganzen Mist ist, dass Oracle ein bisschen seltsames Sicherheitsmodell hat und man einer Prozedur mittels AUTHID mitgeben sollte, mit welchen Privilegien man diese ausführen kann. Will man die gleichen Privilegien als der Ersteller mitgeben, so muss man die Prozedur wie folgt definieren:

1
2
3
4
5
6
7
CREATE OR REPLACE PROCEDURE some_procedure AUTHID DEFINER IS
BEGIN
 DECLARE
 BEGIN

 END;
END;

Will man die des ausführenden Nutzers verwenden, so muss man AUTHID CURRENT_USER statt AUTHID DEFINER verwenden. Das Ergebnis sieht daher wie folgt aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
CREATE OR REPLACE PROCEDURE PURGE_AUDIT_TRAIL (days in number) AUTHID DEFINER IS
BEGIN
 DECLARE
 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;
END;