Выполнить немедленно в рамках процедуры 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;

Другие вопросы по тегам