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

Retter ORA-65096-fejl ved oprettelse af automatiserede test i Django ved hjælp af Oracle

Indholdsfortegnelse

  1. Introduktion
  2. Find ledetråde
  3. Løsning
  4. Referencer

Fejl:ORA-65096:ugyldigt fælles bruger- eller rollenavn i oracle

Introduktion

Hej gutter,
Jeg er ny til backend og django, så jeg havde besluttet at følge django tutorial

Her er nogle detaljer, hvad jeg brugte til at møde og rette denne fejl:

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

Næste semester har jeg et kursus med Oracle, så jeg besluttede at bruge Oracle i stedet for at bruge Sqlite som Django-tutorialen brugte
Jeg har kæmpet med denne linje 'ORA-65096:ugyldigt fælles bruger- eller rollenavn i oracle ' i to dage
Så jeg vil oprette dette indlæg som en guide til alle, der møder dette problem, som jeg er.

Sådan finder du spor

python manage.py test polls

Hvad vi bør

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

Hvad vi faktisk får :(

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

Så programmet mislykkedes, da det forsøgte at oprette en ny bruger

Lad os åbne sqlplus for at oprette en ny bruger manuelt, jeg får den samme fejl, når jeg prøver at oprette ny bruger
"ORA-65096:ugyldigt fælles bruger- eller rollenavn"

Hvorfor?
Jeg logger på som administratorbruger med fulde privilegier

Og så laver jeg nogle undersøgelser og finder ud af det

SQL> show con_name

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

Vi er i containeren 'CDB$ROOT', som er keeper af alle de PDB'er, der er en del af samlingen
PDB er en pluggbar database
Alle PDB'er er tilsluttet CDB$ROOT, denne struktur kaldes en containerdatabase (CDB)
få mere at vide

Bortset fra den slags hovedpine, er alt, hvad vi behøver at vide

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.
  • Så vi har brug for en bruger med con_name er PDB for at oprette bruger på det PDB
SQL> show pdbs;

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

Her kan du se, at der er en pluggbar database ved navn XEPDB1, fordi jeg bruger Oracle XE
Hvis du bruger Oracle 12, vil det være ORCLPDB

Gå til løsning for at se, hvordan du opretter bruger med PDB

Så er vi i gang igen, ny fejl dukkede op

django.db.utils.DatabaseError:ORA-12505:TNS:listener kender i øjeblikket ikke til SID givet i forbindelsesbeskrivelsen

Tjek filen settings.py

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

Prøv at logge ind på sqlplus med den bruger, vi lige har oprettet

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, hvorfor???

Jeg har forsøgt at oprette en bruger med det samme brugernavn, står der

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

Hvorfor ????????

Lav noget research
Fandt ud af, at vi ikke kan bruge brugere på Pluggable Database til at oprette forbindelse til root-container

Og hvordan forbinder vi dog til et bestemt FBF?

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, så lær noget om ezconnect syntaks
sqlplus brugernavn/adgangskode@værtsnavn:port/pdbnavn

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>

Prøv at oprette bruger

SQL> create user test identified by test;

User created.

Perfekt

Men hvordan fortæller vi django ved at bruge denne slags syntaks, men det bliver ved med at kaste fejl i ansigtet på mig

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 så
Prøv i stedet at logge på med tjenestenavnet
Prøv at logge ind med tjenestenavnet i 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

Skift settings.py en lille smule

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

Løsning

  • Opret forbindelse til sqlplus som 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
  • Opret PDB-konto
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.
  • Opret/rediger databaseforbindelse med den bruger Husk at ændre tjenestenavnet til den container, vi har brugt ovenfor Hvis du bruger Oracle 12, container vil være ORCLPDB , tryk på forbindelsesknappen
  • Åbn filen dit websted/dit websted/indstillinger.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'localhost:1521/XEPDB1',
        'USER': 'django',
        'PASSWORD': 'django',
    }
}

Hvis du møder denne fejl, så følg min guide her
django.db.utils.DatabaseError:ORA-12505:TNS:listener kender i øjeblikket ikke til SID givet i forbindelsesbeskrivelsen

  • Anvend migreringerne til appen (igen, fordi vi har oprettet forbindelse til en ny database)
python manage.py migrate
  • Kør 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...
  • Succes, tak fordi du læste med

Referencer

Tutorial link
Blogs og stackoverflow-er, der hjalp mig igennem denne fejl:

  • 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. Hvordan forbinder man to tabeller mysql?

  2. ORA-27154 / ORA-27146

  3. Ydeevne overraskelser og antagelser:STRING_SPLIT()

  4. Sådan nulstilles root-adgangskoden i MySQL 8.0