Oracle Logo

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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.