Oracle Logo

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

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

Werbung


Mein erster Ansatz war, diesen im generischen Exception-Block abzufangen:

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:

DECLARE
	cannotrevokeprivyoudidntgrant EXCEPTION;
	PRAGMA EXCEPTION_INIT(cannotrevokeprivyoudidntgrant, -1927);
BEGIN
	-- Placeholder for revoke the rights from USER
	DBMS_OUTPUT.PUT_LINE('[X] ' || USER || ';');
EXCEPTION
	WHEN cannotrevokeprivyoudidntgrant THEN
		DBMS_OUTPUT.PUT_LINE('[X] ' || USER || ';');
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('[ ] ' || USER || ';');   
END;

Wie man sieht, habe ich die Exception cannotrevokeprivyoudidntgrant an den Fehlercode -1927 gebunden, was der Fehler ORA-01927 ist. Somit hat man dann ganz unkompliziert die Möglichkeit zwischen Erfolg und Misserfolg im Fehlerfall zu unterscheiden. Weiteres kann man in der Dokumentation von Oracle nachlesen.

Veröffentlicht von

Uli

IT-Nerd und Admin

Schreibe einen Kommentar

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