sql >> Database >  >> RDS >> Oracle

ORA-65096-fout oplossen bij het maken van geautomatiseerde tests in Django met behulp van Oracle

Inhoudsopgave

  1. Inleiding
  2. Aanwijzingen vinden
  3. Oplossing
  4. 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

  1. CURTIME() Voorbeelden – MySQL

  2. Verschillende manieren om de SQL CONVERT-datumfunctie te gebruiken

  3. Best Practice voor het maken van indexen op uw MySQL-tabellen - Rolling Index Builds

  4. Hoe een MYSQL auto-increment veld te annoteren met JPA annotaties