如何切换到 Oracle 12+ 中的唯一 PDB?

How to switch to the only PDB in Oracle 12+?

使用 Oracle 的 vagrant boxes,您可以轻松添加 运行 post 安装的脚本,方法是将它们放在 userscripts 目录中。我想创建我的标准用户,这很容易 (CREATE USER etc...)。但是,这些用户需要在 PDB 中创建,而不是在 CDB$ROOT 中创建。

那么,如何从连接到 CDB$ROOT 的 sys / as sysdba 切换到数据库中唯一的 PDB? PDB 的名称不应硬编码,因为它由 Vagrantfile 中的参数控制。该脚本应该 运行 在没有干预的情况下成功。

到目前为止,这段代码可以正常工作,但是很丑陋:

COLUMN pdb_name NEW_VALUE mypdb
SELECT pdb_name
  FROM (
        SELECT pdb_name,
               RANK() OVER (ORDER BY CREATION_SCN) r
          FROM dba_pdbs p1
         WHERE pdb_name <> 'PDB$SEED'
       )
 WHERE r = 1;

ALTER SESSION SET CONTAINER=&mypdb; 

一定有更简单的方法...

如果这确实是 "one and only" pdb,为什么要排序?难道你只需要

COLUMN pdb_name NEW_VALUE mypdb
SELECT pdb_name
FROM dba_pdbs p1
WHERE pdb_name <> 'PDB$SEED'

但由于您使用的是 vagrant 文件,您可以让脚本执行

grep ORACLE_PDB Vagrantfile | awk ...

获取 PDB 的名称,然后设置 TWO_TASK 或类似名称。