Съдържание
- Въведение
- Намиране на улики
- Решение
- Препратки
Грешка:ORA-65096:невалидно име на общ потребител или роля в oracle
Въведение
Здравейте момчета,
Аз съм нов в бекенда и django, така че реших да проследя урока за django
Ето някои подробности какво използвах, за да посрещна и поправя тази грешка:
- Django версия 3.2.5
- База данни:Oracle Database Express Edition (XE) Версия 18.4.0.0.0 (18c)
- Windows 11
Следващия семестър имам курс, използващ Oracle, така че реших да използвам Oracle, вместо да използвам Sqlite като използвания урок за Django
Имам проблеми с този ред „ORA-65096:невалидно име на общ потребител или роля в oracle ' за два дена
Така че искам да създам тази публикация като ръководство за всеки, който среща този проблем, както аз съм.
Намиране на улики
python manage.py test polls
Това, което трябва получи
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'...
Какво всъщност получаваме :(
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
Така че програмата се провали при опит за създаване на нов потребител
Нека отворим sqlplus, за да създадем нов потребител ръчно, получавам същата грешка, когато се опитвам да създам нов потребител
„ORA-65096:невалидно име на общ потребител или роля“
Защо?
Влизам като потребител администратор с пълни привилегии
И така, правя някои изследвания и откривам това
SQL> show con_name
CON_NAME
-----------------------------------
CDB$ROOT
Намираме се в контейнера 'CDB$ROOT', който е пазач на всички PDB, които са част от колекцията
PDB е Pluggable база данни
Всички PDB са включени в CDB$ROOT, тази структура се нарича контейнерна база данни (CDB)
научете повече
Освен този вид главоболие, всичко, което трябва да знаем, е
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.
- Значи ни трябва потребител да има con_name е PDB, за да създадем потребител в този PDB
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
--------------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 XEPDB1 READ WRITE NO
Тук можете да видите, че има Pluggable база данни с име XEPDB1, защото използвам Oracle XE
Ако използвате Oracle 12, това ще бъде ORCLPDB
Отидете на решение, за да видите как да създадете потребител с PDB
Отново започваме, появи се нова грешка
django.db.utils.DatabaseError:ORA-12505:TNS:слушателят в момента не знае за SID, даден в дескриптора на свързване
Проверете файла settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '1521',
}
}
Опитайте да влезете в sqlplus с потребителя, който току-що създадохме
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
Хм, защо???
Опитах се да създам потребител със същото потребителско име, пише
ORA-01920: user name 'DJANGO' conflicts with another user or role name
Защо ??????????
Направете малко проучване
Разбрахме, че не можем да използваме потребители в Pluggable Database, свързващи се с root контейнер
И как обаче да се свържем с конкретен 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.
Добре, тогава научете нещо за синтаксиса на ezconnect
sqlplus потребителско име/парола@име на хост:порт/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>
Опитайте да създадете потребител
SQL> create user test identified by test;
User created.
Перфектно
Но как да кажем на django, използвайки този вид синтаксис обаче, той продължава да хвърля грешки в лицето ми
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.
Добре тогава
Опитайте да влезете с име на услугата
Опитайте да влезете с име на услугата в 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
Променете малко settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'localhost:1521/XEPDB1',
'USER': 'django',
'PASSWORD': 'django',
}
}
Решение
- Свържете се със sqlplus като 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
- Създайте 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.
- Създайте/редактирайте връзка с базата данни с този потребител Не забравяйте да промените името на услугата на контейнера, който сме използвали по-горе Ако използвате Oracle 12, контейнерът ще бъде ORCLPDB , натиснете бутона за свързване
- Отворете файла yoursite/yoursite/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'localhost:1521/XEPDB1',
'USER': 'django',
'PASSWORD': 'django',
}
}
Ако срещнете тази грешка, следвайте моето ръководство тук
django.db.utils.DatabaseError:ORA-12505:TNS:слушателят в момента не знае за SID, даден в дескриптора на свързване
- Приложете миграциите за приложението (отново, защото сме се свързали с нова база данни)
python manage.py migrate
- Изпълнете тест
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...
- Успех, благодаря за четенето
Референции
Линк за урок
Блогове и stackoverflow, които ми помогнаха да преодолея тази грешка:
- 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