sql >> データベース >  >> RDS >> Oracle

Oracleを使用してDjangoで自動テストを作成する際のORA-65096エラーの修正

    目次

    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を使用するコースを持っているので、使用する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

    1. PostgreSQL 9.1:重複せずに配列内の行を連結する方法、別のテーブルに参加する

    2. PGD​​ay.IT2011の早期登録が開始されました

    3. MySQL:列が存在しない場合はALTER TABLE

    4. データベースクエリ:干し草の山から針を見つける方法は?