sql >> Databáze >  >> RDS >> Oracle

Oprava chyby ORA-65096 při vytváření automatických testů v Django pomocí Oracle

Obsah

  1. Úvod
  2. Hledání vodítek
  3. Řešení
  4. Odkazy

Chyba:ORA-65096:neplatný společný název uživatele nebo role v oracle

Úvod

Ahoj hoši,
Jsem nováček v backendu a djangu, takže jsem se rozhodl sledovat django tutoriál

Zde je několik podrobností, co jsem použil ke splnění a odstranění této chyby:

  • Django verze 3.2.5
  • Databáze:Oracle Database Express Edition (XE) verze 18.4.0.0.0 (18c)
  • Windows 11

Příští semestr mám kurz s použitím Oracle, takže jsem se rozhodl použít Oracle místo použití Sqlite jako výukového programu Django
Potýkal jsem se s tímto řádkem „ORA-65096:neplatný běžný název uživatele nebo role v oracle ' na dva dny
Takže chci vytvořit tento příspěvek jako průvodce pro každého, kdo se s tímto problémem setká jako já.

Hledání vodítek

python manage.py test polls

Co bychom měli dostat

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

Co vlastně dostaneme :(

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

Takže program selhal při pokusu o vytvoření nového uživatele

Otevřete sqlplus a vytvořte nového uživatele ručně, při pokusu o vytvoření nového uživatele se zobrazí stejná chyba
"ORA-65096:neplatný společný název uživatele nebo role"

Proč?
Přihlašuji se jako administrátor s plnými právy

A tak dělám nějaké průzkumy a zjišťuji to

SQL> show con_name

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

Jsme v kontejneru 'CDB$ROOT', který je správcem všech PDB, které jsou součástí sbírky
PDB je zásuvná databáze
Všechny PDB jsou zapojeny do CDB$ROOT, tato struktura se nazývá kontejnerová databáze (CDB)
dozvědět se více

Kromě takových bolestí hlavy potřebujeme jen vědět

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.
  • Potřebujeme tedy, aby uživatel měl con_name is PDB k vytvoření uživatele na tomto PDB
SQL> show pdbs;

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

Zde můžete vidět, že existuje Pluggable databáze s názvem XEPDB1, protože používám Oracle XE
Pokud používáte Oracle 12, bude to ORCLPDB

Přejděte na řešení a zjistěte, jak vytvořit uživatele pomocí PDB

Jdeme znovu, objevila se nová chyba

django.db.utils.DatabaseError:ORA-12505:TNS:listener aktuálně nezná SID uvedené v deskriptoru připojení

Zkontrolujte soubor settings.py

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

Zkuste se přihlásit do sqlplus pomocí uživatele, kterého jsme právě vytvořili

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, proč???

Zkoušel jsem vytvořit uživatele se stejným uživatelským jménem, ​​říká

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

Proč ????????

Udělat nějaký výzkum
Zjistili jsme, že nemůžeme používat uživatele v Pluggable Database pro připojení ke kořenovému kontejneru

A jak se však připojíme ke konkrétnímu PNR?

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.

Dobře, pak se naučte něco o syntaxi ezconnect
sqlplus uživatelské jméno/heslo@hostname:port/pdbname

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>

Zkuste vytvořit uživatele

SQL> create user test identified by test;

User created.

Perfektní

Ale jak řekneme django pomocí tohoto druhu syntaxe, pořád mi to hází chyby do očí

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.

Dobře tedy
Zkuste se místo toho přihlásit pomocí názvu služby
Zkuste se přihlásit pomocí názvu služby v 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

Trochu změňte settings.py

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

Řešení

  • Připojte se k sqlplus jako 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
  • Vytvořit účet 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.
  • Vytvořte/upravte připojení k databázi s tímto uživatelem Nezapomeňte změnit název služby na kontejner, který jsme použili výše Pokud používáte Oracle 12, kontejner bude ORCLPDB , stiskněte tlačítko připojit
  • Otevřete soubor yoursite/yoursite/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'localhost:1521/XEPDB1',
        'USER': 'django',
        'PASSWORD': 'django',
    }
}

Pokud narazíte na tuto chybu, postupujte podle mého průvodce zde
django.db.utils.DatabaseError:ORA-12505:TNS:listener aktuálně nezná SID uvedené v popisovači připojení

  • Použijte migraci pro aplikaci (opět proto, že jsme se připojili k nové databázi)
python manage.py migrate
  • Spustit 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...
  • Úspěch, děkujeme za přečtení

Odkazy

Odkaz na tutoriál
Blogy a stackoverflow-s, které mi pomohly překonat tuto chybu:

  • 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. Správný způsob použití LIKE '%{$var}%' s připravenými příkazy? [mysqli]

  2. Přehled kompilace Just-in-Time (JIT) pro PostgreSQL

  3. CHYBA 1045 (28000):Přístup odepřen uživateli 'root'@'localhost' (s použitím hesla:ANO)

  4. Jak přidám indexy do tabulek MySQL?