Oracle 12c ile bilirkte container database kurulumu yaptıysanız artık yeni yapıda daha önceki versiyonlarda almadığınız bir takım hatalar alabilirsiniz. Örneğin 11g ve öncesinde çok basit bir user create işlemi olan aşağıdaki komut artık 12c ile birlikte aşağıdaki hatayı verir oldu.
12c ile birlikte yapı değiştiğinden dolayı artık create etmeye çalışılan user hangi pluggable database altına create edilecekse öncesinde bunu set etmemiz gerekiyor. Aslında bu hatanın bikaç tane çözüm yolu var öncesinde en optimum çözümden bahsedelim;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[oracle@Redhat70 ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Tue May 12 09:32:55 2015 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> create user kamil identified by kamil ; create user kamil identified by kamil * ERROR at line 1: ORA-65096: invalid common user or role name |
Öncelikle kurmuş olduğumuz database içerisindeki tüm servisleri select edelim ;
1 2 3 4 5 6 7 8 9 10 |
SQL> SELECT NAME, PDB FROM V$SERVICES ORDER BY PDB, NAME; NAME PDB ----------------------------------------------- ---------- SYS$BACKGROUND CDB$ROOT SYS$USERS CDB$ROOT t1 CDB$ROOT t1XDB CDB$ROOT pdbt11 PDBT11 pdbt12 PDBT12 |
t1 database’ ine user create edeceksek username başına c## ekleyerek userı create etmek gerekir. (t1 bir pluggable database olmadığından dolayı) ;
SQL> create user c##kamil identified by kamil ;
User created.
Şu anda hangi container’ da olduğumuzu da sorgularsak ;
SQL>show con_name
CON_NAME
——————————
CDB$ROOT
SQL>
Eğer pluggable database’ lerden birine user create etmeniz gerekiyorsa da örneğin ;
1 2 3 4 5 6 7 |
SQL> select con_id, dbid, name,open_mode from V$PDBS; CON_ID DBID NAME OPEN_MODE ---------- ---------- ------------------- ---------- 2 3005292840 PDB$SEED READ ONLY 3 67840626 PDBT11 MOUNTED 4 3755278152 PDBT12 MOUNTED |
Pdbt12 pluggable database’ ine de bir test userı oluşturalım ;
SQL> alter session set container=PDBT12;
Session altered.
SQL> ALTER PLUGGABLE DATABASE pdbt12 OPEN;
Pluggable database altered.
SQL> create user kamil identified by kamil;
User created.
Şimdi database’ deki test adı ile başlayan userları select ettiğimiz de ;
1 2 3 4 5 |
SQL> select username from dba_users where username like '%KAMIL%'; USERNAME -------------------------------------------------------------------------------- KAMIL C##KAMIL |
Hem local pluggable database de KAMIL adı altında bir user olduğunu hemde ortak database’ deki KAMIL userını görebiliriz. C##ile başlayan userlar container database’ inde tanımlı olan userları kastetmektedir.
Bu hatayı gidermenin 2. yöntemi ise ;
Aşağıdaki oracle hidden parametresi alter edilerek true olarak set edildiğinde c## prefix’ sine gerek olmadan komutumuz olduğu gibi çalışacaktır ;
SQL> alter session set “_ORACLE_SCRIPT”=true;
Session altered.
SQL> create user test identified by test ;
User created.
Ancak bu şekilde yapılması çok önerilmez sonuçada create edilmeye çalışılan userın hangi db altına olacağının set edilmesi sonrasında yaşanacak olan karışıklığında önüne geçecektir.
User create edilme işlemi ile ilgili olarak aşağıdaki gibi create edilmeye çalışılması durumunda da benzer hata alınacaktır ;
1 2 3 4 5 |
SQL> create user test2 identified by test2 container=current; create user test2 identified by test2 container=current * ERROR at line 1: ORA-65049: creation of local user or role is not allowed in CDB$ROOT |
Benzer şekilde;
1 2 3 4 5 |
SQL> create user test2 identified by test2 container=all; create user test2 identified by test2 container=all * ERROR at line 1: ORA-65096: invalid common user or role name |
Bu hataların da çözümü yukarıda belirtmiş olduğum açıklama ile aynı şekilde çözülecektir. Mantık aynı aslında ortak database yani container db’ ye user create ediliyorsanız mutlaka c## prefix’ ini kullanmanız gerekir, userı pluggable database’ e oluşturacaksanız da öncesinde mutlaka hangi pluggable database’ de çalışacaksanız onu set etmeniz (örneğin; alter session set container=pdbt12) gerekiyor.