Mục lục
- Giới thiệu
- Tìm manh mối
- Giải pháp
- 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