在 Oracle Procedure 中立即执行

Execute immediate within Oracle Procedure

我有两个用户:SASDBA 和 CDM。 模式 SASDBA 中有一个过程将对象保存到缓冲池中。 程序的一部分:

BEGIN
              FOR TABLE_ENTRY IN
              (SELECT          *
              FROM dba_tables
              WHERE owner = t_owner
              AND TABLE_NAME    = t_name_obj
              )
              LOOP
EXECUTE immediate 'alter table '||TABLE_ENTRY.OWNER||'.'||TABLE_ENTRY.TABLE_NAME||' storage (buffer_pool keep)';
    END LOOP;
END;

所以,如果我尝试将 CDM.TABLE_TEST 传递到过程中,我会得到一个错误:

ORA-01031: insufficient privileges

但是,如果用户 SASDBA 在没有程序的情况下更改它,它会起作用:

alter table CDM.TEST_TABLE  storage (buffer_pool keep)

table CDM.TEST_TABLE altered.

在 PL/SQL 块内,您只有 直接 授予您的权限。通过角色授予的权限(例如 DBA)不适用于 PL/SQL 块,即过程。

直接授予权限,例如GRANT ALTER ANY TABLE TO SASDBA;