Выполнить немедленно в рамках процедуры Oracle
У меня есть два пользователя: 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 ответ
Решение
Внутри блоков PL/SQL у вас есть только те привилегии, которые предоставляются вам напрямую. Привилегии, которые предоставляются через роль (например, DBA
) не применяются внутри блока PL/SQL, то есть процедуры.
Предоставьте привилегию напрямую, например GRANT ALTER ANY TABLE TO SASDBA;