Inhoudsopgave
- Inleiding
- Aanwijzingen vinden
- Oplossing
- Referenties
Fout:ORA-65096:ongeldige algemene gebruikers- of rolnaam in orakel
Inleiding
Hallo jongens,
Ik ben nieuw in backend en django, dus ik had besloten om de django-tutorial te volgen
Hier is wat detail wat ik gebruikte om deze fout te ontmoeten en op te lossen:
- Django versie 3.2.5
- Database:Oracle Database Express Edition (XE) versie 18.4.0.0.0 (18c)
- Windows 11
Volgend semester heb ik een cursus met Oracle, dus ik besloot Oracle te gebruiken in plaats van Sqlite te gebruiken zoals de Django-zelfstudie gebruikte
Ik heb geworsteld met deze regel 'ORA-65096:ongeldige algemene gebruiker of rolnaam in orakel ' voor twee dagen
Dus ik wil dit bericht maken als een gids voor iedereen die dit probleem tegenkomt zoals ik ben.
Aanwijzingen vinden
python manage.py test polls
Wat we moeten krijgen
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'...
Wat krijgen we eigenlijk :(
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
Dus het programma mislukte bij het maken van een nieuwe gebruiker
Laten we sqlplus openen om handmatig een nieuwe gebruiker aan te maken, ik krijg dezelfde foutmelding wanneer ik een nieuwe gebruiker probeer aan te maken
"ORA-65096:ongeldige algemene gebruikers- of rolnaam"
Waarom?
Ik log in als beheerder met volledige rechten
En dus doe ik wat onderzoek en kom erachter dat
SQL> show con_name
CON_NAME
-----------------------------------
CDB$ROOT
We bevinden ons in de container 'CDB$ROOT', die de bewaarder is van alle PDB's die deel uitmaken van de collectie
PDB is een pluggable database
Alle PDB's zijn aangesloten op CDB$ROOT, deze structuur wordt een containerdatabase (CDB) genoemd
meer informatie
Afgezien van dat soort hoofdpijn, is alles wat we moeten weten:
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.
- We hebben dus een gebruiker nodig met con_name is PDB om een gebruiker op die PDB aan te maken
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
--------------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 XEPDB1 READ WRITE NO
Hier kunt u zien dat er een Pluggable-database is met de naam XEPDB1, omdat ik Oracle XE gebruik
Als u Oracle 12 gebruikt, is dit ORCLPDB
Ga naar oplossing om te zien hoe u een gebruiker kunt maken met PDB
Daar gaan we weer, er is een nieuwe fout opgetreden
django.db.utils.DatabaseError:ORA-12505:TNS:listener kent momenteel geen SID in de connect-descriptor
Controleer het bestand settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '1521',
}
}
Probeer in te loggen op sqlplus met de gebruiker die we zojuist hebben aangemaakt
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, waarom???
Ik heb geprobeerd een gebruiker aan te maken met dezelfde gebruikersnaam, er staat:
ORA-01920: user name 'DJANGO' conflicts with another user or role name
Waarom ????????
Doe wat onderzoek
We kwamen erachter dat we geen gebruikers van Pluggable Database kunnen gebruiken om verbinding te maken met rootcontainer
En hoe maken we echter verbinding met een specifieke PDB?
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 leer dan iets over de syntaxis van ezconnect
sqlplus gebruikersnaam/wachtwoord@hostnaam:poort/pdbnaam
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>
Probeer een gebruiker aan te maken
SQL> create user test identified by test;
User created.
Perfect
Maar hoe vertellen we django met dit soort syntaxis, het blijft fouten in mijn gezicht gooien?
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.
Oke dan
Probeer in plaats daarvan in te loggen met de servicenaam
Probeer in te loggen met de servicenaam 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
Wijzig settings.py een beetje
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'localhost:1521/XEPDB1',
'USER': 'django',
'PASSWORD': 'django',
}
}
Oplossing
- Verbind met 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
- Maak een PDB-account
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.
- Maak/bewerk een databaseverbinding met die gebruiker Vergeet niet de servicenaam te wijzigen in de container die we hierboven hebben gebruikt Als u Oracle 12, container wordt ORCLPDB , druk op de verbindingsknop
- Open bestand uwsite/uwsite/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'localhost:1521/XEPDB1',
'USER': 'django',
'PASSWORD': 'django',
}
}
Als je deze fout tegenkomt, volg dan mijn gids hier
django.db.utils.DatabaseError:ORA-12505:TNS:listener kent momenteel geen SID die is opgegeven in de connect-descriptor
- Pas de migraties voor app toe (opnieuw omdat we verbinding hebben gemaakt met een nieuwe database)
python manage.py migrate
- Test uitvoeren
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...
- Geslaagd, bedankt voor het lezen
Referenties
Tutorial link
Blogs en stackoverflow-s die me door deze fout hebben geholpen:
- 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