PL / SQL Процедуры для создания и удаления таблиц - PullRequest
1 голос
/ 05 февраля 2020

Я запускаю процедуру удаления и повторного создания таблицы с помощью PL / SQL, но она не работает, и таблица не обновляется .. сценарий ниже:

CREATE OR REPLACE procedure RUBA.pay_backup
    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;
/

1 Ответ

0 голосов
/ 05 февраля 2020

Проблема здесь заключается в том, что вы имеете дело с моделью безопасности 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;
/

Сделайте некоторые эксперименты, чтобы увидеть, как обстоят дела с этой версией. Обратите внимание, что у вас могут возникнуть проблемы, если вы выполняете это в задании или при подключении от имени другого пользователя.

...