5

ストアド プロシージャで execute immediately コマンドを使用してテーブルを作成しているときに問題が発生しました。ただし、「権限がありません」というエラーが表示されます。他のスレッドをチェックして、ユーザーに「CREATE TABLE」権限が付与されていることを確認しました。ただし、引き続き同じエラーが表示されます。

SQL> select * from USER_SYS_PRIVS;

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
MYUSER            CREATE VIEW                              NO
MYUSER            UNLIMITED TABLESPACE                     NO

SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE VIEW
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE

11 rows selected.

私が作成したダミーの手順は次のとおりです。

create or replace procedure sp_dummy
   as
   begin
      execute immediate 'Create table Dummy99_99 (Dummy_Field number)';
   end sp_dummy;
   /

詳細なエラー:

ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "MYUSER.SP_DUMMY", line 4
ORA-06512: at line 1

私がやっていることは何か間違っていますか?

4

4 に答える 4

10

create viewユーザーに直接付与しただけです。表示されるその他のシステム権限はロールからのものであり、ロールは定義者権限のストアド プロシージャで無効になっています。付与user_role_privsされているロールを確認すると、各ロールが付与する特権を確認できますrole_sys_privs(ロール名を被付与者として)。ロールにもいくつかのレイヤーが存在する可能性があります。

set role noneテーブルを静的に作成しようとする前に行った場合、同じエラーが表示されます。最小限のセットアップでのデモ:

create role myrole;
grant create session, create table, create procedure to myrole;
create user myuser identified by mypasswd;
grant myrole to myuser;
grant create view, unlimited tablespace to myuser;

次に、そのユーザーとして:

SQL> connect myuser/mypasswd
Connected.
SQL> select * from user_sys_privs;

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
MYUSER                         UNLIMITED TABLESPACE                     NO
MYUSER                         CREATE VIEW                              NO

2 rows selected.

SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE VIEW
CREATE PROCEDURE

5 rows selected.

SQL> Create table Dummy99_99 (Dummy_Field number);

Table created.

SQL> drop table Dummy99_99 purge;

Table dropped.

SQL> set role none;

Role set.

SQL> Create table Dummy99_99 (Dummy_Field number);
Create table Dummy99_99 (Dummy_Field number)
*
ERROR at line 1:
ORA-01031: insufficient privileges

ストアド プロシージャのバージョンでは、次のようになります。

SQL> connect myuser/mypasswd
Connected.
SQL> create or replace procedure sp_dummy
  2  as
  3  begin
  4    execute immediate 'Create table Dummy99_99 (Dummy_Field number)';
  5  end sp_dummy;
  6  /

Procedure created.

SQL> exec sp_dummy;
BEGIN sp_dummy; END;

*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "MYUSER.SP_DUMMY", line 4
ORA-06512: at line 1

ストアド プロシージャからテーブルを動的に作成できるようにするには、DBA がcreate tableユーザーに直接次の権限を付与する必要があります。

grant create table to myuser;

次に、手順を再試行します。

SQL> connect myuser/mypasswd
Connected.
SQL> select * from user_sys_privs;

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
MYUSER                         UNLIMITED TABLESPACE                     NO
MYUSER                         CREATE TABLE                             NO
MYUSER                         CREATE VIEW                              NO

SQL> exec sp_dummy;

PL/SQL procedure successfully completed.

SQL> desc Dummy99_99
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DUMMY_FIELD                                        NUMBER

以前は許可されていなかった、または質問で直接許可されたuser_sys_privsことを示していることに注意してください。create table

ただし、スキーマが適切に定義され、安定している必要があるため、オブジェクトを動的に作成することはほとんどありません。このタイプの変更は制御され、リリース プロセスの一部である必要があります。ただし、演​​習として、直接付与が必要です。

于 2015-11-18T08:17:40.517 に答える
4

ユーザーとして接続している場合はmyuser、プロシージャを作成し、それを実行してテーブルを作成できるはずです。

このタスクを実行するために必要な権限は次のとおりです。

  • セッションを作成
  • テーブルを作成
  • 手順の作成

そして、ユーザーに接続した後に手順を実行します。

SQL> CREATE USER TEST IDENTIFIED BY TEST;

User created.

SQL> GRANT CREATE SESSION, CREATE TABLE, CREATE PROCEDURE TO TEST;

Grant succeeded.

SQL> conn TEST/TEST@pdborcl;
Connected.
SQL> show user
USER is "TEST"
SQL> CREATE OR REPLACE PROCEDURE sp_dummy
  2  AS
  3  BEGIN
  4    EXECUTE immediate 'Create table Dummy99_99 (Dummy_Field number)';
  5  END sp_dummy;
  6  /

Procedure created.

SQL> EXEC sp_dummy;

PL/SQL procedure successfully completed.

SQL> select * from dummy99_99;

no rows selected
于 2015-11-18T07:18:05.237 に答える