Sommario
- Introduzione
- Trovare indizi
- Soluzione
- 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