bugfix> oracle > 投稿

私はプロシージャで一時テーブルを作成しようとしています:

PROCEDURE pr_create_tmp_bp_table(fp_id NUMBER) IS
    tbl_name CONSTANT VARCHAR2(20) := 'BP_TO_DELETE';
BEGIN
    -- sanity checks removed for readablity
    EXECUTE IMMEDIATE 
        'CREATE GLOBAL TEMPORARY TABLE ' || tbl_name || ' ' ||
        'ON COMMIT PRESERVE ROWS AS ' ||
        'SELECT * FROM infop_stammdaten.bp';
END;

BEGIN.._END をコピーした場合SQLワークシートをブロックすると、すべてが正常に機能します。したがって、ユーザーには一時テーブルを作成する権利があると思います。同じSQLワークシートからプロシージャを実行すると、

Fehlerbericht -
ORA-01031: Nicht ausreichende Berechtigungen
ORA-06512: in "INFOP_STAMMDATEN.PA_DELETE_FP", Zeile 16
ORA-06512: in Zeile 6
01031. 00000 -  "insufficient privileges"
*Cause:    An attempt was made to perform a database operation without
           the necessary privileges.
*Action:   Ask your database administrator or designated security
           administrator to grant you the necessary privileges

行16(Zeile 16)は、一時テーブルを作成するEXECUTE IMMEDIATEステートメントを指します。

私には、これはユーザーがsqlワークシートで同じ権限を持っていないように見えます。また、プロシージャを実行すると、そのプロシージャも独自のスキーマに含まれます。

回答 1 件
  • あなたの直接の質問に対する答えは、 ORA-01031: insufficient privileges を取得することです  ユーザーにはロールを介して付与されたCREATE TABLE権限があるため、Oracleセキュリティモデルは、PL/SQLのロールを介して付与された権限を使用できないというルールを実施します。そのため、DBAがユーザーにCREATE TABLE権限を直接付与する必要があります。

    それともあなたは?

    あなたがしようとしていることは、Oracleでは意味をなさないからです。 Oracleでは、グローバル一時テーブルは恒久的 構造;一時的なのはそれらのデータだけです。したがって、他のデータベースオブジェクトと同様に、通常のDDLスクリプトを使用してテーブルを1回構築するのが正しい解決策です。その後、必要に応じてグローバル一時テーブルに挿入するだけです。

    あなたはこのサイトでこの間違いを犯した最初の人ではありません(この関連するスレッドを読んでください)。多くの場合、人々は「一時テーブル」と呼ばれる構造を持つSQL Serverなどの別のデータベースから来ているため、実際にはOracleのグローバル一時テーブルとは異なります。それがあなたのシナリオなら、プライベート一時テーブルと呼ばれるOracle 18cの新機能に興味があります。これらは、SQL Serverの一時テーブルとまったく同じです。詳細をご覧ください。

あなたの答え