sql >> Databasteknik >  >> RDS >> Oracle

Fixar ORA-65096-fel när man skapar automatiserade tester i Django med Oracle

Innehållsförteckning

  1. Introduktion
  2. Hitta ledtrådar
  3. Lösning
  4. Referenser

Fel:ORA-65096:ogiltigt vanligt användar- eller rollnamn i Oracle

Introduktion

Hej grabbar,
Jag är ny på backend och django, så jag hade bestämt mig för att följa med django tutorial

Här är lite detaljer vad jag använde för att möta och åtgärda det här felet:

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

Nästa termin har jag en kurs som använder Oracle så jag bestämde mig för att använda Oracle istället för att använda Sqlite som Django-handledningen
Jag har kämpat med den här raden 'ORA-65096:ogiltigt vanligt användar- eller rollnamn i Oracle ' i två dagar
Så jag vill skapa det här inlägget som en guide för alla som möter detta problem som jag är.

Hitta ledtrådar

python manage.py test polls

Vad vi bör skaffa sig

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

Vad vi faktiskt 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 misslyckades när du försökte skapa en ny användare

Låt oss öppna sqlplus för att skapa en ny användare manuellt, jag får samma felmeddelande när jag försöker skapa en ny användare
"ORA-65096:ogiltigt vanligt användar- eller rollnamn"

Varför?
Jag loggar in som administratörsanvändare med fullständiga rättigheter

Och så, jag gör några undersökningar och tar reda på det

SQL> show con_name

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

Vi är i behållaren 'CDB$ROOT', som är innehavaren av alla PDB:er som ingår i samlingen
PDB är en pluggbar databas
Alla PDB:er är inkopplade i CDB$ROOT, denna struktur kallas en containerdatabas (CDB)
läs mer

Förutom den typen av huvudvärk är allt vi behöver veta

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 behöver en användare som har con_name är PDB för att skapa användare på det PDB
SQL> show pdbs;

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

Här kan du se att det finns en pluggbar databas som heter XEPDB1, eftersom jag använder Oracle XE
Om du använder Oracle 12 kommer det att vara ORCLPDB

Gå till lösning för att se hur du skapar användare med PDB

Nu kör vi igen, ett nytt fel dök upp

django.db.utils.DatabaseError:ORA-12505:TNS:listener känner för närvarande inte till SID som ges i anslutningsbeskrivningen

Kontrollera filen settings.py

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

Försök att logga in på sqlplus med användaren vi just skapade

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, varför???

Jag har försökt skapa en användare med samma användarnamn, står det

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

Varför ????????

Gör lite research
Fick reda på att vi inte kan använda användare på Pluggable Database connect to root container

Och hur ansluter vi till ett specifikt 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.

Okej då lär du dig något om ezconnect-syntax
sqlplus användarnamn/lösenord@värdnamn:port/pdbnamn

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>

Försök att skapa användare

SQL> create user test identified by test;

User created.

Perfekt

Men hur ska vi berätta för django genom att använda den här typen av syntax, men det fortsätter att kasta fel i ansiktet 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.

Okej då
Låt försöka logga in med tjänstens namn istället
Försök att logga in med tjänstens namn 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

Ändra settings.py lite

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

Lösning

  • Anslut till 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
  • Skapa 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.
  • Skapa/redigera databasanslutning med den användaren Kom ihåg att ändra tjänstens namn till behållaren vi har använt ovan Om du använder Oracle 12, behållare kommer att vara ORCLPDB , tryck på anslut-knappen
  • Öppna filen yoursite/yoursite/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'localhost:1521/XEPDB1',
        'USER': 'django',
        'PASSWORD': 'django',
    }
}

Om du stöter på det här felet, följ min guide här
django.db.utils.DatabaseError:ORA-12505:TNS:listener känner för närvarande inte till SID som ges i anslutningsbeskrivningen

  • Tillämpa migreringarna för appen (igen eftersom vi har anslutit till en ny databas)
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...
  • Lycka, tack för att du läser

Referenser

Tutorial länk
Bloggar och stackoverflow-s som hjälpte mig igenom detta fel:

  • 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. Postgres:hur rundar man en tidsstämpel uppåt eller nedåt till närmaste minut?

  2. PostgreSQL 11 - Procedurer

  3. Hur man använder cPanel MySQL Database Wizard

  4. SQL Server 2008 Tom sträng mot utrymme