Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Behebung des ORA-65096-Fehlers beim Erstellen automatisierter Tests in Django mit Oracle

Inhaltsverzeichnis

  1. Einführung
  2. Hinweise finden
  3. Lösung
  4. Referenzen

Fehler:ORA-65096:Ungültiger allgemeiner Benutzer- oder Rollenname in Oracle

Einführung

Hallo Leute,
Ich bin neu im Backend und Django, also hatte ich mich entschieden, dem Django-Tutorial zu folgen

Hier sind einige Details, die ich verwendet habe, um diesen Fehler zu finden und zu beheben:

  • Django-Version 3.2.5
  • Datenbank:Oracle Database Express Edition (XE) Version 18.4.0.0.0 (18c)
  • Windows 11

Nächstes Semester habe ich einen Kurs mit Oracle, also habe ich mich entschieden, Oracle anstelle von Sqlite als Django-Tutorial zu verwenden
Ich habe Probleme mit dieser Zeile 'ORA-65096:ungültiger allgemeiner Benutzer- oder Rollenname in Oracle ' für zwei Tage
Daher möchte ich diesen Beitrag als Leitfaden für alle erstellen, die dieses Problem wie ich haben.

Hinweise finden

python manage.py test polls

Was wir sollten werden

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_was_published_recently_with_future_question (polls.tests.QuestionModelTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/path/to/mysite/polls/tests.py", line 16, in test_was_published_recently_with_future_question
    self.assertIs(future_question.was_published_recently(), False)
AssertionError: True is not False

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)
Destroying test database for alias 'default'...

Was wir eigentlich bekommen :(

Creating test database for alias 'default'...
    Failed (ORA-01543: tablespace 'TEST_SYSTEM' already exists)
    It appears the test database, test_system, already exists. Type 'yes' to delete it, or 'no' to cancel: yes
    Destroying old test database for alias 'default'...
    Creating test user...
    Failed (ORA-65096: invalid common user or role name)
    Got an error creating the test user: ORA-65096: invalid common user or role name

Das Programm schlug also fehl, als es versuchte, einen neuen Benutzer anzulegen

Lassen Sie uns sqlplus öffnen, um manuell einen neuen Benutzer zu erstellen. Ich erhalte den gleichen Fehler, wenn ich versuche, einen neuen Benutzer zu erstellen
"ORA-65096:Ungültiger allgemeiner Benutzer- oder Rollenname"

Wieso den?
Ich melde mich als Administrator mit vollen Rechten an

Und so recherchiere ich und finde das heraus

SQL> show con_name

CON_NAME
-----------------------------------
CDB$ROOT

Wir befinden uns im Container „CDB$ROOT“, der der Bewahrer aller PDBs ist, die Teil der Sammlung sind
PDB ist eine Pluggable-Datenbank
Alle PDBs sind in CDB$ROOT eingesteckt, diese Struktur wird als Containerdatenbank (CDB) bezeichnet.
mehr erfahren

Abgesehen von dieser Art von Kopfschmerzen müssen wir nur wissen

99.9% of the time the error ORA-65096: invalid common user or role name means you are logged into the CDB when you should be logged into a PDB.
  • Also brauchen wir einen Benutzer mit con_name ist PDB, um Benutzer auf dieser PDB zu erstellen
SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
--------------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 XEPDB1                         READ WRITE NO

Hier sehen Sie, dass es eine Pluggable-Datenbank namens XEPDB1 gibt, weil ich Oracle XE verwende
Wenn Sie Oracle 12 verwenden, ist dies ORCLPDB

Gehen Sie zur Lösung, um zu sehen, wie Sie Benutzer mit PDB erstellen

Los geht's, neuer Fehler ist aufgetaucht

django.db.utils.DatabaseError:ORA-12505:TNS:Listener kennt derzeit die im Verbindungsdeskriptor angegebene SID nicht

Überprüfen Sie die settings.py-Datei

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '1521',
    }
}

Versuchen Sie, sich mit dem gerade erstellten Benutzer bei sqlplus anzumelden

PS D:\Workplace\Backend\mysite> sqlplus django/django

SQL*Plus: Release 18.0.0.0.0 - Production on Wed Jul 28 15:56:57 2021
Version 18.4.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied

Hm, warum???

Ich habe versucht, einen Benutzer mit demselben Benutzernamen zu erstellen, heißt es

ORA-01920: user name 'DJANGO' conflicts with another user or role name

Warum ????????

Recherchiere
Wir haben herausgefunden, dass wir Benutzer bei Pluggable Database nicht mit dem Root-Container verbinden können

Und wie stellen wir eine Verbindung zu einem bestimmten PDB her?

You are connecting to root container by using sqlplus testtest/password where the user doesn't exist.
Instead, you can use EZConnect or you can create a TNS name to connect to the PDB.

Ok, dann lernen Sie etwas über die ezconnect-Syntax
sqlplus-Benutzername/Passwort@Hostname:Port/PDB-Name

PS D:\Workplace\Backend\mysite> sqlplus django/django@localhost:1521/XEPDB1

SQL*Plus: Release 18.0.0.0.0 - Production on Wed Jul 28 16:05:09 2021
Version 18.4.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Last Successful login time: Wed Jul 28 2021 14:18:57 +07:00

Connected to:
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0

SQL>

Versuchen Sie, einen Benutzer zu erstellen

SQL> create user test identified by test;

User created.

Perfekt

Aber wie sagen wir Django mit dieser Art von Syntax, obwohl es mir immer wieder Fehler ins Gesicht wirft

The HOST and PORT keys need to be left out of the dictionary - else Django will try connecting with the complete "NAME" as an SID.

OK dann
Versuchen Sie stattdessen, sich mit dem Dienstnamen anzumelden
Versuchen Sie, sich mit dem Dienstnamen in sqlplus anzumelden

PS D:\Workplace\Backend\mysite> sqlplus -L "django/django@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XEPDB1)))"

SQL*Plus: Release 18.0.0.0.0 - Production on Wed Jul 28 12:06:33 2021
Version 18.4.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Last Successful login time: Wed Jul 28 2021 12:02:04 +07:00

Connected to:
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0

Ändern Sie settings.py ein wenig

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'localhost:1521/XEPDB1',
        'USER': 'django',
        'PASSWORD': 'django',
    }
}

Lösung

  • Verbinden Sie sich mit sqlplus als sys
PS D:\Workplace\Backend\mysite> sqlplus "sys AS SYSDBA"

SQL*Plus: Release 18.0.0.0.0 - Production on Wed Jul 28 12:47:31 2021
Version 18.4.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
  • PDB-Konto erstellen
SQL> alter session set container = XEPDB1;

Session altered.

SQL> create user django identified by django;

User created.

SQL> grant all privileges to django;

Grant succeeded.
  • Datenbankverbindung mit diesem Benutzer erstellen/bearbeiten Denken Sie daran, den Dienstnamen in den Container zu ändern, den wir oben verwendet haben Wenn Sie verwenden Oracle 12, Container wird ORCLPDB sein , klicken Sie auf die Schaltfläche „Verbinden“
  • Öffnen Sie die Datei yoursite/yoursite/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'localhost:1521/XEPDB1',
        'USER': 'django',
        'PASSWORD': 'django',
    }
}

Wenn Sie auf diesen Fehler stoßen, folgen Sie meiner Anleitung hier
django.db.utils.DatabaseError:ORA-12505:TNS:Listener kennt derzeit die im Verbindungsdeskriptor angegebene SID nicht

  • Wenden Sie die Migrationen für die App an (wiederum, weil wir eine Verbindung zu einer neuen Datenbank hergestellt haben)
python manage.py migrate
  • Test durchführen
PS D:\Workplace\Backend\mysite> python manage.py test polls
Creating test database for alias 'default'...
Creating test user...
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_was_published_recently_with_future_question (polls.tests.QuestionModelTests)
---------------------------------------------------------------------------
Traceback (most recent call last):
  File "D:\Workplace\Backend\mysite\polls\tests.py", line 12, in test_was_published_recently_with_future_question
    self.assertIs(future_question.was_published_recently(), False)
AssertionError: True is not False

---------------------------------------------------------------------------
Ran 1 test in 0.006s

FAILED (failures=1)
Destroying test database for alias 'default'...
Destroying test user...
Destroying test database tables...
  • Erfolgreich, danke fürs Lesen

Referenzen

Tutorial-Link
Blogs und stackoverflow-s, die mir bei diesem Fehler geholfen haben:

  • https://stackoverflow.com/questions/33330968/error-ora-65096-invalid-common-user-or-role-name-in-oracle
  • https://logicalread.com/oracle-pluggable-databases-mc05/#.YQES444za3A
  • https://dba.stackexchange.com/questions/196780/i-cannot-login-to-a-user-i-just-created-in-a-pdb
  • https://stackoverflow.com/questions/19246643/how-do-i-force-django-to-connect-to-oracle-using-service-name