错误:ORA-65096:Oracle中的公共用户名或角色名无效

我刚刚安装了甲骨文,但它缺少Scott模式。所以我试着自己生成它。我得到了Scott模式的SQL脚本,但当我尝试运行查询时:

create user Scott identified by tiger;

它显示以下错误:

ORA-65096:Oracle中的公共用户名或角色名无效。

基本上,它不允许我创建用户Scott.

为什么会这样?我怎样才能解决我的问题?

521079 次浏览

我刚刚安装了Oracle11g

ORA-65096:Oracle中无效的公共用户名或角色名

否,您安装的是甲骨文12c。该错误只能出现在12c上,而不能出现在11g上。

始终检查您的数据库版本到4位小数:

SELECT banner FROM v$version WHERE ROWNUM = 1;

Oracle 12c多租户容器数据库具有:

  • 根容器(国家开发银行
  • 和/或零个、一个或多个可插入数据库(PDB)。

您必须已将数据库创建为容器数据库。当您尝试在容器(即CDB$root)中创建用户时,您应该在可插拔数据库中创建用户。

您不应该在容器中创建与应用程序相关的对象,容器保存了可插入数据库的元数据。对于一般的数据库操作,您应该使用可插拔数据库。否则,不要将其创建为容器,也不要使用多租户。但是,从12CR2开始,您无论如何都不能创建非容器数据库。

最有可能的是,示例架构可能已经安装,您只需要在可插入数据库中开锁

例如,如果您将可插拔数据库创建为pdborcl

sqlplus SYS/password@PDBORCL AS SYSDBA


SQL> ALTER USER scott ACCOUNT UNLOCK IDENTIFIED BY tiger;


sqlplus scott/tiger@pdborcl


SQL> show user;
USER is "SCOTT"

要显示PDB并从根容器连接到可插入数据库,请执行以下操作:

SQL> show con_name


CON_NAME
------------------------------
CDB$ROOT


SQL> show pdbs


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


SQL> alter session set container = ORCLPDB;


Session altered.


SQL> show con_name;


CON_NAME
------------------------------
ORCLPDB

我建议阅读,Oracle 12c安装后的强制步骤


注意:答案建议使用_ORACLE_SCRIPT隐藏参数设置为True在生产系统中是危险的,并且还可能使您的支持合同无效。请注意,在未咨询Oracle支持不要使用隐藏参数的情况下。

在99.9%的情况下,错误ORA-65096: invalid common user or role name表示您登录到CDB,而您应该登录到PDB.例如,如果使用默认的19C安装设置,则应登录到orclpdb(PDB)而不是orcl(CDB)。


危险-如果您坚持以错误的方式创建用户,请执行以下步骤。

像这样设置未记录的参数(如前导下划线所示)只能在Oracle支持人员的指导下进行。在没有此类指导的情况下更改此类参数可能会使您的支持合同无效。所以你要自担风险。

具体来说,如果您将_ABC_设置为0,则将对“ Oracle_维护”列进行一些数据字典更改,并将其设置为“ Y ”。这些用户和对象将被错误地从某些DBA脚本中排除。并且它们可能被错误地包含在某些系统脚本中。

如果您可以接受上述风险,并且不想以正确的方式创建公共用户,请在创建用户之前运行以下命令:

alter session set "_ORACLE_SCRIPT"=true;

我在这里找到了答案。

创建用户对数据库连接工具的依赖关系

sql plus
SQL> connect as sysdba;
Enter user-name: sysdba
Enter password:
Connected.
SQL> ALTER USER hr account unlock identified by hr;
User altered
then create user on sql plus and sql developer

在Oracle 12c及更高版本中,我们有两种类型的数据库:

  1. 集装箱数据库(CDB),以及
  2. 可插入数据库(PDB)。

如果要创建用户,则有两种可能:

  1. 你可以创建一个“容器用户”,也就是“普通用户”。
    普通用户属于CBD以及当前和未来的PDB.这意味着它们可以根据分配的权限在容器数据库或可插拔数据库中执行操作。

    create user c##username identified by password;

  2. 您可以创建一个“可插入用户”,也就是“本地用户”。
    本地用户仅属于单个PDB.这些用户可能被授予管理权限,但仅限于他们所在的PDB.为此,您应该连接到Pluggable Datable,如下所示:

    alter session set container = nameofyourpluggabledatabase;

    在那里,您通常可以像这样创建用户:

    create user username identified by password;

不要忘记指定要使用的表空间,它在导入/导出数据库时非常有用。有关IThttps://docs.oracle.com/database/121/SQLRF/statements_8003.htm#SQLRF01503的更多信息,请参阅此内容

也许,比"_ORACLE_SCRIPT"=true更安全的替代方法是将"_common_user_prefix"C##更改为空字符串。当它为空时-任何名称都可以用于普通用户。发现在那里

在更改该值的过程中,您可能会遇到另一个问题-ORA-02095-无法修改参数,根据您的配置(),可以通过几种方法解决该问题。

所以对我来说:

alter system set _common_user_prefix = ''; scope=spfile;
SQL> alter session set "_ORACLE_SCRIPT"=true;
SQL> create user sec_admin identified by "Chutinhbk123@!";

如果您的目标是创建一个Oracle用户,然后使用它来处理数据库,那么您可能需要考虑这样做:

  • 登录为SYSDBA
  • 创建PDB(也称为可插拔数据库)
  • 为您的PDB创建用户

接下来的内容假设您正在使用本地主机中的数据库,如果不是,只需更改";本地主机";使用您的数据库URI.

示例代码

登录为SYSDBA:

$ sqlplus sys/<your_admin_pws>@localhost as sysdba

然后执行这个:

create pluggable database MYDATABASE
admin user Scott identified by tiger;
file_name_convert = ('/pdbseed/', '/mydatabase/')
;


alter pluggable database MYDATABASE open;

然后,您可能需要向用户Scott授予一些权限:从@localhost注销并以sysdba身份重新登录到新数据库

$ sqlplus sys/<your_admin_pws>@localhost/MYDATABASE as sysdba

并给予斯科特任何你想要的许可。

grant connect to Scott;
grant create view to Scott;
grant create table to Scott;
grant create trigger to Scott;

现在可以开始了:您有一个空的数据库实例和一个用户。只需通过执行以下操作登录

$ sqlplus Scott/tiger@localhost/MYDATABASE

奖金

在那之后,

我遇到了表空间和配额的问题。 带有sqlplus sys/<your_admin_pws>@localhost/MYDATABASE as sysdba

的日志

可以使用列出所有表空间

SELECT TABLESPACE_NAME, STATUS, CONTENTS FROM USER_TABLESPACES;

可以使用以下命令创建新的表空间

CREATE TABLESPACE TABLESPACENAME DATAFILE 'tablespace_datafile.dat' SIZE 10M REUSE AUTOEXTEND ON NEXT 10M MAXSIZE 200M;

您可以使用删除损坏的表空间。

Drop tablespace TABLESPACENAME including contents and datafiles;

您可以授予“访问权限”添加到表空间,以用

alter user Scott quota unlimited on TABLESPACENAME;

注意:quota unlimited可能是一种不好的做法,请查看Oracle文档了解如何限制用户配额

在我的例子中,在安装了默认的Oracle之后,我首先连接到orcl,这导致了问题。重新连接到orclpdb(可插拔数据库,PDB)可解决此问题。

enter image description here enter image description here

enter image description here 在多代理Oracle版本12或更高版本下,有两种类型的用户:

  1. 全局用户,属于CBD容器。要在此容器中创建用户,您必须执行“创建用户”c##username identified by passwod;
  2. 本地用户:属于PDBS数据库(是与父CBD容器相关的元素)。您使用的语法与本地用户的创建相匹配。

如果您使用的是可插拔数据库(PDB),请执行以下操作来解决您的问题:

create user c##Scott identified by tiger;

注意:您必须在用户名前添加C##

这部分可能会解决你的问题。

ALTER SESSION SET";_Oracle_脚本";=真;

按照这个:

> sqlplus /nolog
> connect sys / as sysdba
> alter session set "_oracle_script"=true;
> create user user1 identified by 1;

并创建用户..

对于Docker用户遇到此错误的建议:

我在尝试创建Oracle19c的Docker映像时遇到了同样的错误,原因正如公认的答案所说。我的Docker映像是作为原始数据库的副本,用于在隔离环境中进行测试和开发,因此我的目标是尽可能与原始数据库相似。遗憾的是,原始数据库被配置为非CDB单实例数据库,这不是标准Oracle映像中的默认设置。

首先,我尝试了另类形象,它是受支持的,但它有另一个缺点(两倍大,硬编码的体积)。

最后,我从原始图像和替代图像中提取出$ORACLE_BASE/*.sh脚本,分析差异并将相关差异应用到原始脚本上。重要的更改是在dbca.rsp.tmpl文件中,以及在删除$ORACLE_PDB环境重新配置alter system启动SQL脚本的使用中,还必须执行一些进一步的相关更改,例如运行状况检查。

然后,Oracle在非CDB模式下成功启动。可以验证尝试create user foo identified by foo;作为system用户(成功)或select name, cdb, con_id from v$database;(返回cdb=0)。