Oracle
 sql >> Database >  >> RDS >> Oracle

Correzione dell'errore ORA-65096 durante la creazione di test automatizzati in Django utilizzando Oracle

Sommario

  1. Introduzione
  2. Trovare indizi
  3. Soluzione
  4. Riferimenti

Errore:ORA-65096:utente comune o nome del ruolo non valido in Oracle

Introduzione

Ciao ragazzi,
Sono nuovo di backend e django, quindi ho deciso di seguire il tutorial di django

Ecco alcuni dettagli che stavo usando per soddisfare e correggere questo errore:

  • Django versione 3.2.5
  • Database:Oracle Database Express Edition (XE) versione 18.4.0.0.0 (18c)
  • Finestre 11

Il prossimo semestre, ho un corso su Oracle, quindi ho deciso di usare Oracle invece di usare Sqlite come il tutorial di Django utilizzato
Ho lottato con questa riga "ORA-65096:utente comune o nome del ruolo non valido in Oracle ' per due giorni
Quindi voglio creare questo post come guida per chiunque incontri questo problema come me.

Trovare indizi

python manage.py test polls

Cosa dovremmo ottenere

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'...

Cosa otteniamo effettivamente :(

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

Quindi il programma non è riuscito durante il tentativo di creare un nuovo utente

Apriamo sqlplus per creare un nuovo utente manualmente, ottengo lo stesso errore quando provo a creare un nuovo utente
"ORA-65096:utente comune o nome del ruolo non valido"

Come mai?
Sto accedendo come utente amministratore con privilegi completi

E così, faccio alcune ricerche e lo scopro

SQL> show con_name

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

Siamo nel container 'CDB$ROOT', che è il custode di tutti i PDB che fanno parte della collezione
PDB è un database collegabile
Tutti i PDB sono inseriti in CDB$ROOT, questa struttura è chiamata database container (CDB)
saperne di più

A parte quel tipo di mal di testa, tutto ciò che dobbiamo sapere è

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.
  • Quindi abbiamo bisogno che un utente abbia con_name è PDB per creare un utente su quel PDB
SQL> show pdbs;

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

Qui puoi vedere che esiste un database Pluggable chiamato XEPDB1, perché sto usando Oracle XE
Se stai usando Oracle 12 sarà ORCLPDB

Vai alla soluzione per vedere come creare un utente con PDB

Ci risiamo, è apparso un nuovo errore

django.db.utils.DatabaseError:ORA-12505:TNS:listener non conosce attualmente il SID fornito nel descrittore di connessione

Controlla il file settings.py

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

Prova ad accedere a sqlplus con l'utente che abbiamo appena creato

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

Hmm, perché???

Ho provato a creare un utente con lo stesso nome utente, dice

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

Perché????????

Fare qualche ricerca
Abbiamo scoperto che non possiamo utilizzare gli utenti in Pluggable Database per connettersi al contenitore principale

E come ci colleghiamo a un PDB specifico?

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, allora impara qualcosa sulla sintassi di ezconnect
sqlplus nome utente/password@nomehost:porta/nomepdb

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>

Prova a creare utente

SQL> create user test identified by test;

User created.

Perfetto

Ma come possiamo dire a django usando questo tipo di sintassi, tuttavia, continua a lanciarmi errori in faccia

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.

Va bene allora
Proviamo invece ad accedere con il nome del servizio
Prova ad accedere con il nome del servizio in sqlplus

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

Modifica un po' settings.py

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

Soluzione

  • Connetti a sqlplus come 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
  • Crea un account PDB
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.
  • Crea/Modifica connessione database con quell'utente Ricorda di cambiare il nome del servizio nel contenitore che abbiamo utilizzato sopra Se stai utilizzando Oracle 12, il contenitore sarà ORCLPDB , premi il pulsante di connessione
  • Apri il file yoursite/yoursite/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'localhost:1521/XEPDB1',
        'USER': 'django',
        'PASSWORD': 'django',
    }
}

Se incontri questo errore, segui la mia guida qui
django.db.utils.DatabaseError:ORA-12505:TNS:listener attualmente non conosce il SID fornito nel descrittore di connessione

  • Applica le migrazioni per l'app (sempre perché ci siamo collegati a un nuovo database)
python manage.py migrate
  • Esegui test
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...
  • Successo, grazie per la lettura

Riferimenti

Collegamento tutorial
Blog e stackoverflow-s che mi hanno aiutato a superare questo errore:

  • 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