Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Memperbaiki kesalahan ORA-65096 saat membuat tes otomatis di Django menggunakan Oracle

Daftar Isi

  1. Pengantar
  2. Menemukan petunjuk
  3. Solusi
  4. Referensi

Kesalahan:ORA-65096:nama pengguna atau peran umum yang tidak valid di Oracle

Pengantar

Hallo teman-teman,
Saya baru mengenal backend dan django, jadi saya memutuskan untuk mengikuti tutorial django

Berikut ini beberapa detail yang saya gunakan untuk memenuhi dan memperbaiki kesalahan ini:

  • Django versi 3.2.5
  • Database:Oracle Database Express Edition (XE) Rilis 18.4.0.0.0 (18c)
  • Windows 11

Semester depan, saya ada kursus menggunakan Oracle jadi saya memutuskan untuk menggunakan Oracle daripada menggunakan Sqlite seperti yang digunakan tutorial Django
Saya telah berjuang dengan baris ini 'ORA-65096:nama pengguna atau peran umum yang tidak valid di Oracle ' untuk dua hari
Jadi saya ingin membuat postingan ini sebagai panduan bagi siapa saja yang mengalami masalah ini seperti saya.

Menemukan petunjuk

python manage.py test polls

Apa yang kita harus Dapatkan

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

Apa yang sebenarnya kita dapatkan :(

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

Jadi program gagal saat mencoba membuat pengguna baru

Mari kita buka sqlplus untuk membuat pengguna baru secara manual, saya mendapatkan kesalahan yang sama ketika mencoba membuat pengguna baru
"ORA-65096:nama peran atau pengguna umum tidak valid"

Mengapa?
Saya masuk sebagai pengguna administrator dengan hak penuh

Jadi, saya melakukan beberapa penelitian dan menemukan bahwa

SQL> show con_name

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

Kami berada di wadah 'CDB$ROOT', yang merupakan penyimpan semua PDB yang merupakan bagian dari koleksi
PDB adalah database Pluggable
Semua PDB dicolokkan ke CDB$ROOT, struktur ini disebut database container (CDB)
pelajari lebih lanjut

Selain sakit kepala semacam itu, yang perlu kita ketahui adalah

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.
  • Jadi kita membutuhkan user yang memiliki con_name adalah PDB untuk membuat user pada PDB tersebut
SQL> show pdbs;

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

Di sini Anda dapat melihat ada database Pluggable bernama XEPDB1, karena saya menggunakan Oracle XE
Jika Anda menggunakan Oracle 12, itu akan menjadi ORCLPDB

Buka solusi untuk melihat cara membuat pengguna dengan PDB

Ini dia lagi, kesalahan baru muncul

django.db.utils.DatabaseError:ORA-12505:TNS:listener saat ini tidak mengetahui SID yang diberikan di deskriptor koneksi

Periksa file settings.py

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

Coba login ke sqlplus dengan user yang baru saja kita buat

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

Saya telah mencoba membuat pengguna dengan nama pengguna yang sama, katanya

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

Kenapa ????????

Lakukan beberapa penelitian
Ternyata kami tidak dapat menggunakan pengguna di Pluggable Database connect to root container

Dan bagaimana kita terhubung ke PDB tertentu?

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 kemudian pelajari sesuatu tentang sintaks ezconnect
sqlplus nama pengguna/kata sandi@namahost:port/namapdb

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>

Coba buat pengguna

SQL> create user test identified by test;

User created.

Sempurna

Tapi bagaimana kita memberitahu Django menggunakan sintaks semacam ini, itu terus melempar kesalahan ke wajahku

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.

Oke kalau begitu
Mari coba masuk dengan nama layanan sebagai gantinya
Coba login dengan nama layanan di 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

Ubah settings.py sedikit

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

Solusi

  • Hubungkan ke sqlplus sebagai 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
  • Buat akun 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.
  • Buat/Edit koneksi Database dengan pengguna itu Ingatlah untuk mengubah nama layanan ke wadah yang telah kami gunakan di atas Jika Anda menggunakan Oracle 12, wadah akan menjadi ORCLPDB , tekan tombol sambungkan
  • Buka file yoursite/yoursite/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'localhost:1521/XEPDB1',
        'USER': 'django',
        'PASSWORD': 'django',
    }
}

Jika Anda menemui kesalahan ini, ikuti panduan saya di sini
django.db.utils.DatabaseError:ORA-12505:TNS:listener saat ini tidak mengetahui SID yang diberikan di deskriptor koneksi

  • Terapkan migrasi untuk aplikasi (sekali lagi karena kami telah terhubung ke database baru)
python manage.py migrate
  • Jalankan pengujian
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...
  • Berhasil, terima kasih telah membaca

Referensi

tautan tutorial
Blog dan stackoverflow-s yang membantu saya mengatasi kesalahan ini:

  • 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. Subquery Oracle tidak melihat variabel dari blok luar 2 level ke atas

  2. Membuat Database Oracle 12c – Langkah demi langkah

  3. Cara Membuat PL/SQL SYS_REFCURSOR Di Database Oracle

  4. Tingkatkan grup disk VOTE di ASM untuk Peningkatan GI 12.2

  5. Oracle PL/SQL - Koleksi (Tabel Bersarang)