Spis treści
- Wprowadzenie
- Znajdowanie wskazówek
- Rozwiązanie
- 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