Oracle
 sql >> база данни >  >> RDS >> Oracle

Коригиране на грешка ORA-65096 при създаване на автоматизирани тестове в Django с помощта на Oracle

Съдържание

  1. Въведение
  2. Намиране на улики
  3. Решение
  4. Препратки

Грешка: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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Кога или защо да използвате SET DEFINE OFF в Oracle Database

  2. ORA-4031 грешки с Direct NFS

  3. Как мога да получа достъп до Oracle от Python?

  4. Има ли функция в oracle, подобна на group_concat в mysql?

  5. Как да актуализирате с вътрешно присъединяване в Oracle