我刚刚安装了 Oracle XE 18c(我是从 11g XE 迁移过来的)...运行安装程序后,我看到了新功能;例如,Oracle 现在支持多租户模型和称为可插拔数据库的概念......
我发现的第一个问题是创建一个新用户......看起来为了支持可插拔数据库的概念,用户名必须符合一些命名规则前缀(即c##)......搜索这个问题,我找到这个链接......他们建议使用旧语法(在non-CDB 上使用的那个)创建用户,我们应该使用以下方法更改会话:
alter session set "_ORACLE_SCRIPT"=true;
但是,他们警告说,用户不能在任何可插入数据库中使用......
所以,这是我的问题:如果在提交命令后创建用户,用户是在 ROOT 容器(CDB$ROOT)中创建的吗?此类用户将是 Oracle 实例的本地用户,可用于管理所有其他可插拔数据库,包括 CDB(假设此类用户具有所有必需的权限)?
谢谢!
免责声明:我不是 DBA,我只是一名软件开发人员,对数据库有先进的知识......
C##
是的,将在 CDB 中创建以开头的普通用户。它们将在所有 PDB 中可用(假设它们具有正确的权限)。如果您需要在 PDB 中创建用户,请确保连接到 PDB (
SID=XEPDB
) 而不是 CDB (SID=XE
)在挖掘了
"_ORACLE_SCRIPT"=true
命令并在数据库中进行了一些测试之后,我得出了以下结论:这
_ORACLE_SCRIPT"=true
是一个强大的命令。因为它是一个下划线参数,所以它应该是私有的并且只用于Oracle ......但是,它似乎是应该使用的有效情况,例如,这个(但这些假设非常罕见)。 ..在我提出的案例中,当我发出命令时,我关闭了一些数据库保护
_ORACLE_SCRIPT"=true
,允许绕过创建“commons”用户所需的语法......用户是在根容器(又名CDB$ROOT
)中创建的...... .我可以通过两个查询来验证这一点:SELECT SYS_CONTEXT('USERENV', 'CON_NAME') from dual;
SELECT * FROM ALL_USERS ORDER BY USERNAME;
第一个查询显示当前容器,第二个查询显示该容器中可用的用户。
奇怪的部分来自查询视图“all_users”,它说我刚刚创建的用户是“ORACLE_MAINTAINED”的普通用户(不是)......可悲的是,这样的用户并不常见,因为你不能和他一起访问其他可插拔数据库(正如我提供的链接所说)并且它在其他可插拔数据库中不存在......
所以,总结一下:用户是在
CDB$ROOT
绕过 Oracle 语法规则中创建的,但是这样的用户只是这样的容器的本地用户......