Archive for Oktober, 2010

Oracle 11g Kennwörter

Vor kurzem habe ich über meine Probleme mit den neuen Einstellungen für das Default-Profil berichtet.

Der dort gezeigte Trick – das Profil anpassen – funktioniert leider nur für Konten, deren Kennwörter noch nicht abgelaufen (expired) sind.

Der einzige mir bekannte Weg, Konten mit abgelaufenem Kennwort wieder zu aktivieren, ist das Kennwort tatsächlich zu ändern.

Also zum altbekannten Hack gegriffen:

declare
  pwdval   varchar2(30);
  stmt     varchar2(32000);
begin
  select password
    into pwdval
    from dba_users
  where username ='TESTACC';
  stmt := 'alter user TESTACC identified by values '''||pwdval||''' ';
  dbms_output.put_line(stmt);
  execute immediate stmt;
end;
/

Das scheitert leider, weil ab 11g das Feld Password in dba_users nur noch 3 Ausprägungen annimmt (‘GLOBAL’, EXTERNAL’, NULL) und nicht mehr, wie noch unter 10gR2 den Kennwort-Hash enthält.

Also dba_users durch sys.user$ und username durch name ersetzt und das Konto wieder aktiviert und dank der Profiländerung läuft es jetzt auch nicht mehr ab.

Ich war einen kurzen Moment glücklich, bis ich über ein Phänomen gestolpert bin: Auf einmal ist nur für dieses Konto die Groß- Kleinschreibung der Kennwörter wieder egal.

Wie konnte das passieren?

Also, ein Testcase muß her:

SQL> select value from v$parameter where name = 'sec_case_sensitive_logon';
VALUE
--------------------------------------------------------------------------------
TRUE

SQL> grant connect to testacc identified by TestAcc;
Grant succeeded.
SQL> connect testacc/TestAcc
Connected.
SQL> connect testacc/testacc
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL> connect / as sysdba
Connected.
SQL> select name, password from user$ where name='TESTACC';

NAME                           PASSWORD
------------------------------ ------------------------------
TESTACC                        74437186882FE56E

SQL> alter user TESTACC identified by values '74437186882FE56E';

User altered.

SQL> connect testacc/testacc
Connected.

SQL> select value from v$parameter where name = 'sec_case_sensitive_logon';
VALUE
--------------------------------------------------------------------------------
TRUE

Nach den Erfahrungen von oben war das zu erwarten.

Lassen wir die Datenbank doch mal selbst berichten, wie sie das Konto anlegen würde:

SQL> drop user testacc cascade;
User dropped.
SQL> grant connect to testacc identified by TestAcc;
Grant succeeded.
SQL> connect testacc/testacc
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL> connect / as sysdba
SQL>select dbms_metadata.get_ddl('USER','TESTACC') from dual
DBMS_METADATA.GET_DDL('USER','TESTACC')
--------------------------------------------------------------------------------
 CREATE USER "TESTACC" IDENTIFIED BY VALUES
'S:BD70207D2CA75B0C0A4759A8F7FF2C39CA03126C8FB6AA499A789E4A9C7E;74437186882FE56E'
      DEFAULT TABLESPACE "USERS"
      TEMPORARY TABLESPACE "TEMP"

Wow, das ist mal ein Langer Hash, der offensichtlich aus zwei Teilen besteht: der zweite, durch den Semikolon abgetrennte Hash ist der Sting aus sys.user$.password.
Nur, wo kommt der Rest her? Ein bisschen gesucht, et voilà:

SQL>select name, password, spare4 from sys.user$ where name='TESTACC'
NAME                           PASSWORD
------------------------------ ------------------------------
SPARE4
--------------------------------------------------------------------------------
TESTACC                        74437186882FE56E
S:BD70207D2CA75B0C0A4759A8F7FF2C39CA03126C8FB6AA499A789E4A9C7E

Der neue Hash versteckt sich also im Feld SPARE4 der sys.user$ – Dieses Feld ist wohl nicht mehr aufgespart ;-)

In: Administration, OracleAuthor: Robert MarzComments (0)

SQLDeveloper Datamodeler kostenlos und Early Adoptor version 3.0

Ohne großes Tamtam hat Oracle die Lizenzkosten für den SQL Developer Data Modeler gestrichen.

Damit gibt es jetzt ein weiteres freies Produkt, mit dem man Oracle-Spezifische Datenmodelle erzeugen und DML generieren kann.

Außerdem wurde eine Early Adopter Version für Release 3.0 freigegeben.

In: OracleAuthor: Robert MarzComments (0)

IDE-Sprache im SQLDeveloper

Mir geht die Eindeutschung der Oberflächen von Tools manchmal etwas zu weit.

In den deutschen Menüs des SQLDeveloper muss ich immer wieder mal mehrere Übersetz-Anläufe starten, bis ich die richtige Bedeutung von Menüpunkten erfasst habe.

Immer häufiger habe ich mir die englische Oberfläche gewünscht. Irgendwann war der Druck groß genug, und ich bin auf die Suche gegangen und fündig geworden:

Die Sprache der Oberfläche lässt sich in der Konfigurationsdatei sqldeveloper\ide\bin\ide.conf anpassen:

AddVMOption -Duser.language=en
AddVMOption -Duser.country=DE

Wenn man diese beiden Zeilen hinzufügt, startet der SQLDeveloper beim nächsten Mal mit englischer Oberfläche und der Rest (z.b. die Dezimaltrenner) bleibt deutsch.

In: OracleAuthor: Robert MarzComments (1)

Stolpersteine bei der Migration auf Oracle 11g (R2)

Dass sich in Oracle 11g Sicherheitseinstellungen geändert haben, hat sich zu den meisten ja bereits herumgesprochen.

Mit Änderungen, die sofort auffallen, kann man ja bei der Migration umgehen:
als Beispiel sei hier die plötzlich relevante Groß/Kleinschreibung von Kennwörtern genannt. Dieses Verhalten kann man zum Glück ja wieder deaktivieren (gut) oder betroffene Anwendungen rechtzeitig Anpassen (besser) …

Heute morgen bekam ich aber von einem Skript, dass sich auch an die Datenbank anmeldet, eine E-Mail, mit folgendem Fehler:

ORA-28002: the password will expire within 7 days

Eine kurzer Check ergab, dass die zugehörige Datenbank vor 181 Tagen aufgebaut wurde und die Default-Profile jetzt mit einer Password Liftime von 180 und einer Password Grace Time von 7 Tagen angelgt wird.

Die Fehlermeldung besagt einfach nur, dass die 180 Tage jetzt vorbei sind und der Benutzer sich in der “grace period” befindet und doch gefälligst sein Kennwort ändern soll.

Ich wage gar nicht zu schätzen, wieviel Anwendungen da draußen existieren, die mit dieser Fehlermeldung nicht umgehen können, von den Zahllosen Batch-Jobs (wie meinem) ganz zu schweigen.

Dem Spuk kann man mit

ALTER PROFILE "DEFAULT" LIMIT
    PASSWORD_LIFE_TIME UNLIMITED;

ein Ende bereiten.

Damit ist das alte Verhalten wieder hergestellt.

In: Administration, OracleAuthor: Robert MarzComments (3)