Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle का उपयोग करके Django में स्वचालित परीक्षण बनाते समय ORA-65096 त्रुटि को ठीक करना

विषय-सूची

  1. परिचय
  2. सुराग ढूँढना
  3. समाधान
  4. संदर्भ

त्रुटि:ORA-65096:oracle में अमान्य सामान्य उपयोगकर्ता या भूमिका का नाम

परिचय

हैलो दोस्तों,
मैं बैकएंड और django के लिए नया हूं, इसलिए मैंने django ट्यूटोरियल के साथ अनुसरण करने का निर्णय लिया था

यहाँ कुछ विवरण दिया गया है जिसका उपयोग मैं इस त्रुटि को पूरा करने और ठीक करने के लिए कर रहा था:

  • Django संस्करण 3.2.5
  • डेटाबेस:Oracle डेटाबेस एक्सप्रेस संस्करण (XE) रिलीज़ 18.4.0.0.0 (18c)
  • विंडोज 11

अगले सेमेस्टर में, मेरे पास Oracle का उपयोग करने वाला एक कोर्स है, इसलिए मैंने Sqlite का उपयोग करने के बजाय Oracle का उपयोग करने का निर्णय लिया क्योंकि Django ट्यूटोरियल का उपयोग किया गया था
मैं इस लाइन 'ORA-65096:अमान्य आम उपयोगकर्ता या oracle में भूमिका नाम के साथ संघर्ष कर रहा हूं ' दो दिनों के लिए
इसलिए मैं इस पोस्ट को किसी भी व्यक्ति के लिए एक मार्गदर्शक के रूप में बनाना चाहता हूं जो इस समस्या को पूरा करता है जैसा कि मैं हूं।

सुराग ढूँढना

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 एक प्लग करने योग्य डेटाबेस है
सभी पीडीबी को सीडीबी$रूट में प्लग किया गया है, इस संरचना को कंटेनर डेटाबेस (सीडीबी) कहा जाता है।
अधिक जानें

इस प्रकार के सिरदर्द के अलावा, हमें केवल यह जानने की आवश्यकता है

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.
  • इसलिए हमें उस पीडीबी पर उपयोगकर्ता बनाने के लिए एक उपयोगकर्ता की जरूरत है जिसका नाम con_name है पीडीबी है
SQL> show pdbs;

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

यहाँ आप देख सकते हैं कि XEPDB1 नाम का एक प्लग करने योग्य डेटाबेस है, क्योंकि मैं Oracle XE का उपयोग कर रहा हूँ
यदि आप Oracle 12 का उपयोग कर रहे हैं तो यह ORCLPDB होगा

पीडीबी के साथ उपयोगकर्ता कैसे बनाया जाए, यह देखने के लिए समाधान पर जाएं

यहाँ हम फिर से चलते हैं, नई त्रुटि दिखाई दी

django.db.utils.DatabaseError:ORA-12505:TNS:श्रोता वर्तमान में कनेक्ट डिस्क्रिप्टर में दिए गए SID के बारे में नहीं जानते हैं

सेटिंग्स की जाँच करें। 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

क्यों ????????

कुछ अनुसंधान करें
पता चला कि हम प्लग करने योग्य डेटाबेस में उपयोगकर्ताओं का उपयोग रूट कंटेनर से कनेक्ट नहीं कर सकते हैं

और हालांकि हम एक विशिष्ट पीडीबी से कैसे जुड़ते हैं?

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 उपयोगकर्ता नाम/पासवर्ड@होस्टनाम:पोर्ट/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 के रूप में कनेक्ट करें
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
  • पीडीबी खाता बनाएं
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:श्रोता वर्तमान में कनेक्ट डिस्क्रिप्टर में दिए गए 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...
  • सफल, पढ़ने के लिए धन्यवाद

संदर्भ

ट्यूटोरियल लिंक
ब्लॉग और स्टैकओवरफ्लो-एस जिन्होंने इस त्रुटि के माध्यम से मेरी मदद की:

  • https://stackoverflow.com/questions/33330968/error-ora-65096-invalid-common-user-or-role-name-in-oracle
  • https://logicread.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. पीएल/एसक्यूएल के माध्यम से ओरेकल निर्यात करने का प्रयास करने की तारीख 0000-00-00

  2. LENGTH () Oracle में फ़ंक्शन

  3. एक निश्चित समय अंतराल पर कुल कार्य

  4. क्या पीएल/एसक्यूएल के पास जावा के बराबर स्ट्रिंगटोकनाइज़र है?

  5. MyBatis का उपयोग करके Oracle में अंतिम सम्मिलित आईडी कैसे प्राप्त करें?