在Oracle数据库中指定CONTAINER=CURRENT创建common user的相关问题
Oracle CDB中用CONTAINER=CURRENT创建Common User的那些事儿
执行指定语句的结果
先直接说结论:CREATE USER c##comm_user IDENTIFIED BY comm_pwd CONTAINER = CURRENT;创建的还是Common User——因为它符合Common User的硬性命名要求:必须以C##或c##开头。
但和用CONTAINER=ALL创建的区别是,这个用户只会出现在你当前操作的容器里:
- 如果你现在在CDB根容器(CDB$ROOT)执行这条语句,那这个用户只存在于根容器,不会自动跑到所有PDB里;
- 如果你在某个应用根容器(Application Root)执行,那它就只在这个应用根里,不会同步到下属的应用PDB。
CONTAINER=CURRENT和ALL的核心区别
在CDB根容器(CDB$ROOT)操作时
CONTAINER=ALL:创建的Common User会自动在根容器+所有已存在的PDB里生成,之后新建的PDB也会自动带上这个用户(除非特意配置排除)。CONTAINER=CURRENT:只在根容器创建用户,PDB里没有这个用户的映射。如果要让这个用户访问某个PDB,得手动到目标PDB里执行ALTER USER c##comm_user CONTAINER=CURRENT来启用,或者手动在PDB里创建该用户(本质是关联到根容器的同一个Common User)。
在应用容器(Application Root)操作时
CONTAINER=ALL:用户会自动在应用根+该应用根下所有已有的应用PDB里创建,后续新建的应用PDB也会默认包含这个用户。CONTAINER=CURRENT:仅在当前应用根创建用户,下属应用PDB里没有。要让用户访问应用PDB,同样得手动到目标应用PDB里做启用操作。
额外提醒
- 哪怕用
CURRENT创建,这个用户的核心元数据还是存在根容器(CDB级)或应用根(应用容器级),本质还是Common User,只是没自动同步到下属容器而已。 - 如果创建用户时没加
C##/c##前缀,哪怕写了CONTAINER=ALL,也只能创建成Local User,成不了Common User。
内容的提问来源于stack exchange,提问作者oramas
相关产品推荐
相关产品推荐

