Получение недостаточных привилегий при создании последовательности Oracle с использованием процедуры, но без использования блока plsql - PullRequest
0 голосов
/ 06 декабря 2018
Begin
Execute immediate 'CREATE SEQUENCE seq1 MINVALUE 1 MAXVALUE 99 START WITH 1INCREMENT BY 1 CACHE 20';
End;
Sequence creating successfully.

Create or replace procedure proc_seq as
Begin
Execute immediate 'CREATE SEQUENCE seq2 MINVALUE 1 MAXVALUE 99 START WITH 1INCREMENT BY 1 CACHE 20';
End;

Exec proc_seq();
Error: Insufficient Privilege...

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Это проблема , которая вызывает / определяет права .По умолчанию хранимая процедура имеет определенное право (DR - выделение добавлено):

Во время вызова сервера, когда модуль DR помещается в стек вызовов, база данных сохраняет текущие включенные роли и текущуюзначения CURRENT_USER и CURRENT_SCHEMA.Затем он меняет и CURRENT_USER, и CURRENT_SCHEMA на владельца модуля DR и разрешает только роль PUBLIC.

Если ваша привилегия на создание последовательности была предоставлена ​​вам через роль, то, поскольку эта роль будет отключена, эта привилегия не активна.Вы можете убедиться в этом, запустив set role none, что приведет к сбою анонимного блока с той же ошибкой.

Как сказал @Littlefoot, вы можете получить привилегию непосредственно вместо (или кака также через роль.

Кроме того, вы можете указать, что процедура должна иметь права вызывающего:

Create or replace procedure proc_seq
authid current_user
as
Begin
Execute immediate 'CREATE SEQUENCE seq2 MINVALUE 1 MAXVALUE 99 START WITH 1INCREMENT BY 1 CACHE 20';
End;
/

exec proc_seq;

PL/SQL procedure successfully completed.

select seq2.nextval from dual;

   NEXTVAL
----------
         1

Надеюсь, это надуманный пример;В любом случае, вы бы не создавали объекты базы данных во время выполнения ...


Недостаток этого подхода в том, что он может не подходить для того, как вы собираетесь вызывать процедуру.Если вы запускаете его от своего имени, это нормально, но если вы будете предоставлять разрешение на выполнение другим пользователям, тогда они должны будут иметь соответствующие привилегии (предоставленные либо напрямую, либо через роль);и будет создавать объекты в своей собственной схеме.Это может быть именно то, что вы хотите.Но если это не так, и вы не хотите предоставлять вызывающим абонентам create sequence или заставлять их создавать свои собственные объекты, тогда вы можете оставить процедуру с определенными правами и предоставить привилегию своему пользователю напрямую.

0 голосов
/ 06 декабря 2018

Если вы приобрели привилегию CREATE SEQUENCE через роль (очевидно, вы это сделали), она будет работать и на уровне SQL, а также в анонимных блоках PL / SQL (ваш первый код).

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

...