Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Naprawienie błędu ORA-65096 podczas tworzenia testów automatycznych w Django przy użyciu Oracle

Spis treści

  1. Wprowadzenie
  2. Znajdowanie wskazówek
  3. Rozwiązanie
  4. Referencje

Błąd:ORA-65096:nieprawidłowa nazwa wspólnego użytkownika lub roli w Oracle

Wprowadzenie

Cześć chłopaki,
Jestem nowy w backendzie i django, więc zdecydowałem się śledzić wraz z samouczkiem django

Oto kilka szczegółów, których użyłem, aby spotkać się i naprawić ten błąd:

  • Django w wersji 3.2.5
  • Baza danych:Oracle Database Express Edition (XE) wydanie 18.4.0.0.0 (18c)
  • Windows 11

W następnym semestrze mam kurs wykorzystujący Oracle, więc zdecydowałem się użyć Oracle zamiast używać Sqlite jako samouczka Django
Mam problem z wierszem „ORA-65096:nieprawidłowa nazwa wspólnego użytkownika lub roli w Oracle ' na dwa dni
Dlatego chcę stworzyć ten post jako przewodnik dla każdego, kto napotka ten problem tak jak ja.

Znajdowanie wskazówek

python manage.py test polls

Co powinniśmy Dostawać

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 właściwie otrzymujemy :(

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

Dlatego program nie powiódł się podczas próby utworzenia nowego użytkownika

Otwórzmy sqlplus, aby ręcznie utworzyć nowego użytkownika, ten sam błąd pojawia się podczas próby utworzenia nowego użytkownika
„ORA-65096:nieprawidłowa nazwa wspólnego użytkownika lub roli”

Czemu?
Loguję się jako administrator z pełnymi uprawnieniami

I tak robię badania i dowiaduję się, że

SQL> show con_name

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

Znajdujemy się w kontenerze 'CDB$ROOT', który przechowuje wszystkie pliki PDB, które są częścią kolekcji
PDB to podłączana baza danych
Wszystkie pliki PDB są podłączone do CDB$ROOT, ta struktura nazywa się bazą danych kontenerów (CDB)
dowiedz się więcej

Oprócz tego rodzaju bólu głowy, wszystko, co musimy wiedzieć, to:

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.
  • Więc potrzebujemy użytkownika, który ma con_name to PDB, aby utworzyć użytkownika na tym PDB
SQL> show pdbs;

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

Tutaj widać, że istnieje baza danych Pluggable o nazwie XEPDB1, ponieważ używam Oracle XE
Jeśli używasz Oracle 12, będzie to ORCLPDB

Przejdź do rozwiązania, aby zobaczyć, jak utworzyć użytkownika za pomocą pliku PDB

Znowu zaczynamy, pojawił się nowy błąd

django.db.utils.DatabaseError:ORA-12505:TNS:listener nie zna obecnie identyfikatora SID podanego w deskryptorze połączenia

Sprawdź plik settings.py

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

Spróbuj zalogować się do sqlplus za pomocą właśnie utworzonego użytkownika

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

Mówi, że próbowałem utworzyć użytkownika o tej samej nazwie użytkownika

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

Dlaczego ????????

Zrobić rozeznanie
Okazało się, że nie możemy używać użytkowników w Pluggable Database połączyć się z kontenerem głównym

A jak łączymy się z konkretnym 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, dowiedz się czegoś o składni ezconnect
sqlplus nazwa użytkownika/hasło@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>

Spróbuj utworzyć użytkownika

SQL> create user test identified by test;

User created.

Idealny

Ale jak powiedzieć django przy użyciu tego rodzaju składni, to ciągle wyrzuca mi błędy w twarz

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.

Dobrze więc
Spróbuj zamiast tego zalogować się przy użyciu nazwy usługi
Spróbuj zalogować się przy użyciu nazwy usługi w 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

Zmień trochę settings.py

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

Rozwiązanie

  • Połącz się z 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
  • Utwórz konto 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.
  • Utwórz/edytuj połączenie z bazą danych z tym użytkownikiem Pamiętaj, aby zmienić nazwę usługi na kontener, którego używaliśmy powyżej Jeśli używasz Oracle 12, kontenerem będzie ORCLPDB , naciśnij przycisk łączenia
  • Otwórz plik twojawitryna/twojawitryna/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'localhost:1521/XEPDB1',
        'USER': 'django',
        'PASSWORD': 'django',
    }
}

Jeśli napotkasz ten błąd, postępuj zgodnie z moim przewodnikiem tutaj
django.db.utils.DatabaseError:ORA-12505:TNS:listener nie zna obecnie SID podanego w deskryptorze połączenia

  • Zastosuj migracje dla aplikacji (ponownie, ponieważ połączyliśmy się z nową bazą danych)
python manage.py migrate
  • Uruchom 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...
  • Udało się, dzięki za przeczytanie

Referencje

Link do samouczka
Blogi i przepełnienia stosu, które pomogły mi przez ten błąd:

  • https://stackoverflow.com/questions/33330968/error-ora-65096-invalid-common-user-lub-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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie, aby znaleźć pełne skany tabeli w Oracle

  2. ORA-12728:nieprawidłowy zakres w wyrażeniu regularnym

  3. Jak skutecznie przekonwertować tekst na liczbę w Oracle PL/SQL przy użyciu innych niż domyślna wartości NLS_NUMERIC_CHARACTERS?

  4. SQL Server 2016 w systemie Linux

  5. Jak mogę ograniczyć liczbę wierszy zwracanych przez zapytanie Oracle po złożeniu zamówienia?