在 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;
我有两个用户: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;