Проблема здесь заключается в том, что вы имеете дело с моделью безопасности Oracle, которая обычно требует прямого предоставления или роли при выполнении в контексте скомпилированной процедуры PL / SQL.
Скорее всего, вы видите ORA-01031: insufficient privileges
.
Возможно, ваш пользователь получил CREATE TABLE
через роль, но не напрямую. Проверьте это следующим образом:
-- List system privs granted via a role
select * from ROLE_SYS_PRIVS where ROLE in (select ROLE from USER_ROLE_PRIVS)
/
-- List system privs granted directly
select * from USER_SYS_PRIVS
/
Существует два простых способа заставить вашу процедуру работать:
Опция 1
Предоставление CREATE TABLE
напрямую для вашего пользователя. Подключитесь как администратор базы данных и сделайте следующее:
GRANT CREATE TABLE TO RUBA;
К сожалению, это немного тупой инструмент и, вероятно, не то, что вы хотите сделать.
Опция 2
Создайте свою процедуру с правами вызывающего:
CREATE OR REPLACE procedure RUBA.pay_backup AUTHID CURRENT_USER
as
r_create_table varchar(1000);
Begin
Begin
r_create_table := 'Drop table payment_backup';
Execute Immediate r_create_table;
Exception
When Others Then
Null;
End;
r_create_table := 'Create Table payment_backup as Select * from payment_table';
Execute Immediate r_create_table;
End;
/
Сделайте некоторые эксперименты, чтобы увидеть, как обстоят дела с этой версией. Обратите внимание, что у вас могут возникнуть проблемы, если вы выполняете это в задании или при подключении от имени другого пользователя.