Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sửa lỗi ORA-65096 khi tạo kiểm tra tự động trong Django bằng Oracle

Mục lục

  1. Giới thiệu
  2. Tìm manh mối
  3. Giải pháp
  4. Tài liệu tham khảo

Lỗi:ORA-65096:tên vai trò hoặc người dùng chung không hợp lệ trong oracle

Giới thiệu

Xin chào các bạn,
Tôi mới làm quen với phụ trợ và django, vì vậy tôi đã quyết định làm theo hướng dẫn django

Dưới đây là một số chi tiết tôi đã sử dụng để gặp và khắc phục lỗi này:

  • Phiên bản Django 3.2.5
  • Cơ sở dữ liệu:Bản phát hành Oracle Database Express Edition (XE) 18.4.0.0.0 (18c)
  • Windows 11

Học kỳ tới, tôi có một khóa học sử dụng Oracle vì vậy tôi quyết định sử dụng Oracle thay vì sử dụng Sqlite như hướng dẫn Django đã sử dụng
Tôi đã đấu tranh với dòng này ' ORA-65096:tên người dùng hoặc vai trò thông thường không hợp lệ trong oracle ' trong hai ngày
Vì vậy, tôi muốn tạo bài đăng này như một hướng dẫn cho bất kỳ ai gặp vấn đề này như tôi.

Tìm manh mối

python manage.py test polls

Những gì chúng ta nên mắc phải

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

Những gì chúng tôi thực sự nhận được :(

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

Vì vậy, chương trình không thành công khi cố gắng tạo người dùng mới

Hãy mở sqlplus để tạo người dùng mới theo cách thủ công, tôi gặp lỗi tương tự khi cố tạo người dùng mới
"ORA-65096:tên vai trò hoặc người dùng chung không hợp lệ"

Tại sao?
Tôi đang đăng nhập với tư cách là người dùng quản trị viên với đầy đủ các đặc quyền

Và vì vậy, tôi thực hiện một số nghiên cứu và phát hiện ra rằng

SQL> show con_name

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

Chúng tôi đang ở trong vùng chứa 'CDB $ ROOT', là nơi lưu giữ tất cả các PDB là một phần của bộ sưu tập
PDB là một cơ sở dữ liệu có thể cắm được
Tất cả các PDB đều được cắm trong CDB $ ROOT, cấu trúc này được gọi là cơ sở dữ liệu vùng chứa (CDB)
tìm hiểu thêm

Ngoài những loại đau đầu đó, tất cả những gì chúng ta cần biết là

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.
  • Vì vậy, chúng tôi cần một người dùng có con_name là PDB để tạo người dùng trên PDB đó
SQL> show pdbs;

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

Ở đây bạn có thể thấy có một cơ sở dữ liệu có thể cắm được tên là XEPDB1, vì tôi đang sử dụng Oracle XE
Nếu bạn đang sử dụng Oracle 12, nó sẽ là ORCLPDB

Đi tới giải pháp để xem cách tạo người dùng với PDB

Chúng ta lại tiếp tục, lỗi mới xuất hiện

django.db.utils.DatabaseError:ORA-12505:TNS:người nghe hiện không biết về SID được cung cấp trong bộ mô tả kết nối

Kiểm tra tệp settings.py

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

Cố gắng đăng nhập sqlplus bằng người dùng mà chúng tôi vừa tạo

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, tại sao ???

Tôi đã cố gắng tạo một người dùng có cùng tên người dùng đó, nó cho biết

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

Tại sao ????????

Làm một vài nghiên cứu
Phát hiện ra rằng chúng tôi không thể sử dụng người dùng tại Cơ sở dữ liệu có thể kết nối với vùng chứa gốc

Và làm thế nào để chúng tôi kết nối với một PDB cụ thể?

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, sau đó tìm hiểu về cú pháp ezconnect
sqlplus tên người dùng / mật khẩu @ tên máy chủ: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>

Cố gắng tạo người dùng

SQL> create user test identified by test;

User created.

Hoàn hảo

Nhưng làm thế nào để chúng tôi nói với django bằng cách sử dụng loại cú pháp này, nó tiếp tục ném lỗi vào mặt tôi

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.

Được rồi
Thay vào đó, hãy thử đăng nhập bằng tên dịch vụ
Cố gắng đăng nhập bằng tên dịch vụ trong 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

Thay đổi settings.py một chút

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

Giải pháp

  • Kết nối với sqlplus dưới dạng 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
  • Tạo tài khoản 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.
  • Tạo / Chỉnh sửa kết nối Cơ sở dữ liệu với người dùng đó Hãy nhớ thay đổi tên dịch vụ thành vùng chứa mà chúng tôi đã sử dụng ở trên Nếu bạn đang sử dụng Oracle 12, vùng chứa sẽ là ORCLPDB , nhấn vào nút kết nối
  • Mở tệp trang web của bạn / trang web của bạn / cài đặt.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'localhost:1521/XEPDB1',
        'USER': 'django',
        'PASSWORD': 'django',
    }
}

Nếu bạn gặp lỗi này, hãy làm theo hướng dẫn của tôi tại đây
django.db.utils.DatabaseError:ORA-12505:TNS:người nghe hiện không biết về SID được cung cấp trong bộ mô tả kết nối

  • Áp dụng di chuyển cho ứng dụng (một lần nữa vì chúng tôi đã kết nối với cơ sở dữ liệu mới)
python manage.py migrate
  • Chạy thử nghiệm
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...
  • Thành công, cảm ơn bạn đã đọc

Tham khảo

Liên kết hướng dẫn
Các blog và stackoverflow-s đã giúp tôi khắc phục lỗi này:

  • 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-corated-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. Cách tránh thay thế biến trong Oracle SQL Developer bằng 'trinidad &tobago'

  2. Kiểu dữ liệu Oracle:Tôi nên sử dụng VARCHAR2 hay CHAR

  3. Sử dụng Dapper với các thủ tục được lưu trữ của Oracle trả về con trỏ

  4. Làm thế nào để sử dụng Alias ​​trong mệnh đề Where?

  5. 12c Các tính năng không được dùng nữa