Как системный пользователь у меня возникает эта ошибка: ORA-01031: недостаточно прав. - PullRequest
0 голосов
/ 29 мая 2020

У меня есть хранимая процедура удаления разделов. Перед запуском я должен удалить ограничение.

Я установил хранимую процедуру для системного пользователя. Когда я тестирую процедуру, я получаю эту ошибку: 'ORA-01031: недостаточные привилегии' .

Это фрагмент кода, который я написал:

BEGIN

    EXECUTE IMMEDIATE 'ALTER TABLE USER_NAME.TABLE_NAME DISABLE CONSTRAINT CONSTRAINT_NAME';

EXCEPTION
    WHEN OTHERS THEN

        O_sCodError := 'NO_OK';
        O_sDesError := 'Error at DISABLE CONSTRAINT_NAME: ' || SQLERRM || ';';

        RETURN;

END;

Что ж, поскольку я выполняю хранимую процедуру как системную, я не понимаю причину этой ошибки. И я думаю, что в конечном итоге я думаю о той же ошибке, когда пытаюсь удалить раздел.

Ответы [ 3 ]

0 голосов
/ 29 мая 2020

Во-первых, вы никогда не должны устанавливать собственный код в схему Oracle по умолчанию, такую ​​как SYSTEM. Поместите свой код в специальную схему приложения. Поскольку он содержит динамические c SQL (немедленное выполнение), вы можете подумать о том, чтобы сделать его процедурой с «правами вызывающего», а затем предоставить права на выполнение для пользователя, который будет его выполнять.

При этом , в Oracle 11g тот, кто использует привилегии для запуска блока PL / SQL, должен иметь прямые разрешения для базовой таблицы, а не унаследованные разрешения через роль, подобную DBA. Если у процедуры есть «права определения», то схема, которой принадлежит процедура, должна иметь прямые привилегии для таблицы. Если "права инициатора", то пользователь, выполняющий процедуру, должен иметь права.

Дополнительные сведения см. По этой ссылке: Выполнить немедленно в пределах Oracle Процедура

0 голосов
/ 30 мая 2020

Вы должны предоставить прямой привилегии учетной записи SYSTEM ( без роли ) для запуска ALTER TABLE в целевой таблице, поскольку роли не включены в хранимых процедурах по умолчанию: https://asktom.oracle.com/Misc/RolesAndProcedures.html .

Попробуйте:

grant alter any table to system;

или

grant alter table on user_name.table_name to system;
0 голосов
/ 29 мая 2020

У меня работает на 11g XE:

SQL> show user
USER is "SCOTT"
SQL>
SQL> create table test
  2    (id     number   constraint pk_test primary key,
  3     name   varchar2(20)
  4    );

Table created.

SQL> connect system
Enter password:
Connected.
SQL> begin
  2    execute immediate 'alter table scott.test disable constraint pk_test';
  3    return;
  4  end;
  5  /

PL/SQL procedure successfully completed.

SQL>

Пожалуйста, следуйте этому примеру и выполните его в своей базе данных. Опубликуйте результат (отредактировав вопрос, а не как комментарий).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...