sql >> データベース >  >> RDS >> Oracle

CREATEテーブルの付与があっても即時実行が失敗する

    create viewしかありません ユーザーに直接付与されます。表示される他のシステム権限はロールからのものであり、ロールはdefiner's-rightsストアドプロシージャで無効になっています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が表示されるようになりました 直接付与されましたが、以前は付与されていませんでした。

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



    1. 2つの日付の間の月は機能します

    2. NodeJSMySQLへの同時リクエストを処理する方法

    3. mysqlテーブルを特定のサイズに制限し、最も古いエントリを自動的に削除します

    4. ODP.NET、Managed Driver Beta(Oracle.ManagedDataAccess.dll)を使用したLDAPルックアップがC#アプリケーションで失敗する