我有两个用户: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已更改。
答案 0 :(得分:2)
在PL / SQL块中,您只拥有授予直接的权限。通过角色授予的权限(例如DBA
)不适用于PL / SQL块,即程序。
直接授予权限,例如GRANT ALTER ANY TABLE TO SASDBA;