在 Oracle 过程中立即执行
Posted
技术标签:
【中文标题】在 Oracle 过程中立即执行【英文标题】:Execute immediate within Oracle Procedure 【发布时间】:2017-12-04 11:58:48 【问题描述】:我有两个用户: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 已更改。
【问题讨论】:
你是从SASDBA用户那里调用这个过程吗? 【参考方案1】:在 PL/SQL 块中,您只有直接授予您的权限。通过角色授予的特权(例如DBA
)不适用于 PL/SQL 块(即过程)内。
直接授予权限,例如GRANT ALTER ANY TABLE TO SASDBA;
【讨论】:
以上是关于在 Oracle 过程中立即执行的主要内容,如果未能解决你的问题,请参考以下文章