Dieser Blogeintrag beschäftigt sich mit dem ORA-28221 Fehler, der beim Versuch das eigene Passwort zu ändern ausgelöst werden kann und zeigt mehrere mögliche Lösungen für dieses Problems.
Table of Contents
Demo-Umgebung
Für die Demonstration verwende ich die folgende Demo-Umgebung.
SQL> SELECT BANNER FROM v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production PL/SQL Release 12.1.0.1.0 - Production CORE 12.1.0.1.0 Production TNS for Linux: Version 12.1.0.1.0 - Production NLSRTL Version 12.1.0.1.0 - Production
Zusätzlich wurden die folgenden Objekte in der Datenbank angelegt.
SQL> -- Password Verify Function definieren SQL> CREATE OR REPLACE FUNCTION DEMO_PWD_VERIFY ( username VARCHAR2, password VARCHAR2, old_password VARCHAR2 ) RETURN BOOLEAN IS BEGIN RETURN TRUE; END; / SQL> -- Profil erstellen SQL> CREATE PROFILE DEMO_PROFILE LIMIT PASSWORD_VERIFY_FUNCTION DEMO_PWD_VERIFY; SQL> -- Demo Benutzer erstellen SQL> CREATE USER DEMO_PWD IDENTIFIED BY demo PROFILE DEMO_PROFILE; SQL> GRANT CREATE SESSION TO DEMO_PWD;
Problembeschreibung
Bei dem Versuch das eigene Passwort zu ändern, wird eine ORA-28221 Fehlermeldungen ausgelöst.
SQL> CONNECT demo_pwd/demo Connected. SQL> ALTER USER demo_pwd IDENTIFIED BY demoNEU; ALTER USER demo_pwd IDENTIFIED BY demoNEU * ERROR at line 1: ORA-28221: REPLACE not specified
Die Ursache für dieses Problem ist die Verwendung einer Password Verify Function. Mithilfe der folgenden Abfrage können Details zu dem verwendeten Benutzerprofil eingesehen werden.
SQL> -- Anmeldung als SYS SQL> CONNECT / AS SYSDBA SQL> SET linesize 250 pagesize 100 SQL> COL limit FOR a30 SQL> SELECT resource_name, limit FROM dba_profiles WHERE profile = (SELECT profile FROM dba_users WHERE username = 'DEMO_PWD') ORDER BY resource_name; RESOURCE_NAME LIMIT -------------------------------- ------------------------------ COMPOSITE_LIMIT DEFAULT CONNECT_TIME DEFAULT CPU_PER_CALL DEFAULT CPU_PER_SESSION DEFAULT FAILED_LOGIN_ATTEMPTS DEFAULT IDLE_TIME DEFAULT LOGICAL_READS_PER_CALL DEFAULT LOGICAL_READS_PER_SESSION DEFAULT PASSWORD_GRACE_TIME DEFAULT PASSWORD_LIFE_TIME DEFAULT PASSWORD_LOCK_TIME DEFAULT PASSWORD_REUSE_MAX DEFAULT PASSWORD_REUSE_TIME DEFAULT PASSWORD_VERIFY_FUNCTION DEMO_PWD_VERIFY PRIVATE_SGA DEFAULT SESSIONS_PER_USER DEFAULT
Lösung
Alle vorgestellten Lösungen basieren auf der oben genannten Demo-Umgebung.
REPLACE angeben
Die einfachste und auch empfohlende Lösung ist die Übergabe des alten Passwortes durch das Hinzufügen des REPLACE Zusatzes.
SQL> -- Anmeldung als DEMO_PWD Benutzer SQL> CONNECT demo_pwd/demo SQL> -- Änderung des Passwortes SQL> ALTER USER demo_pwd IDENTIFIED BY demoNEU REPLACE demo; User altered.
ALTER USER Privileg vergeben
Als zweite Lösung kann dem Benutzer das ALTER USER Privileg zugewiesen werden. Da das ALTER USER Privileg noch weitere Rechte mit einschließt, sollte diese Lösung nur in Ausnahmefällen verwendet werden.
SQL> -- Anmelden als SYS SQL> CONNECT / AS SYSDBA SQL> -- Grant vergeben SQL> GRANT ALTER USER TO demo_pwd;
Anschließend kann der Benutzer das Kennwort mit dem gewohnten Kommando ändern.
SQL> -- Anmeldung als DEMO_PWD Benutzer SQL> CONNECT demo_pwd/demo SQL> -- Änderung des Passwortes SQL> ALTER USER demo IDENTIFIED BY demoNEU; User altered.
Neues Profil ohne Password Verify Function erstellen
Wird das ALTER USER Kommando zum Ändern des Passwortes zum Beispiel durch eine Anwendung generiert, die nicht geändert werden kann, kann als Workaround ein spezielles Profil für den betroffenen Benutzer erstellt werden. Das neue Profil darf keinePassword Verify Function gesetzt haben.
SQL> -- Anmelden als SYS SQL> CONNECT / AS SYSDBA SQL> -- Profil erstellen SQL> CREATE PROFILE DEMO_PROFILE_NEW LIMIT PASSWORD_VERIFY_FUNCTION NULL; SQL> -- Profil dem Benutzer hinzufügen SQL> ALTER USER demo_pwd PROFILE DEMO_PROFILE_NEW;
Anschließend kann der Benutzer das Kennwort mit dem gewohnten Kommando ändern.
SQL> -- Anmeldung als DEMO_PWD Benutzer SQL> CONNECT demo_pwd/demo SQL> -- Änderung des Passwortes SQL> ALTER USER demo IDENTIFIED BY demoNEU; User altered.
Der Nachteil dieser Lösung ist der, dass die Passwortrichtlinien nicht eingehalten werden müssen.