Oracle 多租户 - 在另一个容器中执行 PL/SQL,超过 DBMS_SQL
Oracle multitenant - execute PL/SQL, over DBMS_SQL, in another container
文档说
execute immediate 'alter session set container=myPDB'
从 PDB 中禁用(可能从 CDB 根和应用程序容器中禁用),
但它并没有反对 DBMS_SQL.PARSE。
我希望它能够在 DBMS_SQL.PARSE 上从 PDB 在另一个 PDB 中执行 PL/SQL,但出现了错误:
ORA-01031: 权限不足
所以,这样看来也是不可能的。
测试如下
我以 SYSDBA 身份登录 CDB Root。
然后我可以执行以下操作:
declare
c1 int;
rowsn integer;
statem varchar2(500);
ctx varchar2(128);
BEGIN
c1 := DBMS_SQL.OPEN_CURSOR;
ctx :='myPDB';
statem :=' declare
var1 varchar2(60);
begin
select user into var1 from dual;
end;';
DBMS_SQL.PARSE(c => c1 ,
statement => statem,
language_flag => DBMS_SQL.NATIVE,
container => ctx);
rowsn:=DBMS_SQL.EXECUTE(c=>c1);
DBMS_SQL.CLOSE_CURSOR(c=>c1);
END;
/
而且有效!
但是一旦我切换到 PDB as
alter session set container=myPDB;
我不能再做以下事情了
alter session set container=myPDB;
declare
c1 int;
rowsn integer;
statem varchar2(500);
ctx varchar2(128);
BEGIN
c1 := DBMS_SQL.OPEN_CURSOR;
ctx :='myPDB2';
statem :=' declare
var1 varchar2(60);
begin
select user into var1 from dual;
end;';
DBMS_SQL.PARSE(c => c1 ,
statement => statem,
language_flag => DBMS_SQL.NATIVE,
container => ctx);
rowsn:=DBMS_SQL.EXECUTE(c=>c1);
DBMS_SQL.CLOSE_CURSOR(c=>c1);
END;
/
是否有可能在另一个 PDB 中通过 DBMS_SQL.PARSE 从 PDB 执行 PL/SQL?
PDB 是有效独立的数据库,具有独立的安全性(用户、角色、权限等)。他们之间没有可见性。您必须将它们视为独立的独立数据库。独立 Oracle 数据库交互的唯一方式是通过数据库链接。
文档说
execute immediate 'alter session set container=myPDB'
从 PDB 中禁用(可能从 CDB 根和应用程序容器中禁用),
但它并没有反对 DBMS_SQL.PARSE。 我希望它能够在 DBMS_SQL.PARSE 上从 PDB 在另一个 PDB 中执行 PL/SQL,但出现了错误: ORA-01031: 权限不足
所以,这样看来也是不可能的。 测试如下
我以 SYSDBA 身份登录 CDB Root。
然后我可以执行以下操作:
declare
c1 int;
rowsn integer;
statem varchar2(500);
ctx varchar2(128);
BEGIN
c1 := DBMS_SQL.OPEN_CURSOR;
ctx :='myPDB';
statem :=' declare
var1 varchar2(60);
begin
select user into var1 from dual;
end;';
DBMS_SQL.PARSE(c => c1 ,
statement => statem,
language_flag => DBMS_SQL.NATIVE,
container => ctx);
rowsn:=DBMS_SQL.EXECUTE(c=>c1);
DBMS_SQL.CLOSE_CURSOR(c=>c1);
END;
/
而且有效!
但是一旦我切换到 PDB as
alter session set container=myPDB;
我不能再做以下事情了
alter session set container=myPDB;
declare
c1 int;
rowsn integer;
statem varchar2(500);
ctx varchar2(128);
BEGIN
c1 := DBMS_SQL.OPEN_CURSOR;
ctx :='myPDB2';
statem :=' declare
var1 varchar2(60);
begin
select user into var1 from dual;
end;';
DBMS_SQL.PARSE(c => c1 ,
statement => statem,
language_flag => DBMS_SQL.NATIVE,
container => ctx);
rowsn:=DBMS_SQL.EXECUTE(c=>c1);
DBMS_SQL.CLOSE_CURSOR(c=>c1);
END;
/
是否有可能在另一个 PDB 中通过 DBMS_SQL.PARSE 从 PDB 执行 PL/SQL?
PDB 是有效独立的数据库,具有独立的安全性(用户、角色、权限等)。他们之间没有可见性。您必须将它们视为独立的独立数据库。独立 Oracle 数据库交互的唯一方式是通过数据库链接。