Oracle Logo

Erläuterung des Definitionsparameter AUTHID bei Prozeduren in Oracle Database

Oracle LogoIch 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.

Werbung


Mein erster Versuch der Prozedur sah wie folgt aus:

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:

CREATE OR REPLACE PROCEDURE some_procedure AUTHID DEFINER IS
BEGIN
	DECLARE
	BEGIN 
		<PLSQL-CODE>
	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:

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;

Veröffentlicht von

Uli

IT-Nerd und Admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.