在Oracle Procedure中立即执行

时间:2017-12-04 11:58:49

标签: sql oracle stored-procedures execute grant

我有两个用户: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:权限不足

但是,如果用户SASDBA在没有程序的情况下改变它,它就可以工作:

alter table CDM.TEST_TABLE  storage (buffer_pool keep)
  

表CDM.TEST_TABLE已更改。

1 个答案:

答案 0 :(得分:2)

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

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