目次
- はじめに
- 手がかりを見つける
- 解決策
- 参考資料
エラー:ORA-65096:Oracleの共通ユーザーまたはロール名が無効です
こんにちはみんな、
私はバックエンドとdjangoを初めて使用するので、djangoチュートリアルに従うことにしました
このエラーに対応して修正するために使用していた詳細は次のとおりです。
- Djangoバージョン3.2.5
- データベース:Oracle Database Express Edition(XE)リリース18.4.0.0.0(18c)
- Windows 11
次の学期、私はOracleを使用するコースを持っているので、使用するDjangoチュートリアルとしてSqliteを使用する代わりにOracleを使用することにしました。
私はこの行で苦労してきました'ORA-65096:Oracleでの無効な共通ユーザーまたはロール名 '2日間
ですから、私がこの問題に直面した人のためのガイドとして、この投稿を作成したいと思います。
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
コレクションの一部であるすべてのPDBのキーパーであるコンテナー'CDB$ROOT'にいます。
PDBはプラガブルデータベースです
すべての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.
- したがって、そのPDB上にユーザーを作成するにはcon_nameがPDBであるユーザーが必要です
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
--------------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 XEPDB1 READ WRITE NO
ここでは、Oracle XEを使用しているため、XEPDB1という名前のプラガブルデータベースがあることがわかります。
Oracle 12を使用している場合は、ORCLPDBになります
ソリューションに移動して、PDBを使用してユーザーを作成する方法を確認してください
ここでまた行きます、新しいエラーが現れました
django.db.utils.DatabaseError:ORA-12505:TNS:listenerは現在、接続記述子で指定された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
なぜ????????
調査を行う
PluggableDatabaseのユーザーをルートコンテナに接続することはできません
そして、どのようにして特定の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 username / password @ hostname: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>
ユーザーを作成してみてください
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',
}
}
- sysとしてsqlplusに接続します
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:listenerは現在、接続記述子で指定された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-s:
- 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