私はプロシージャで一時テーブルを作成しようとしています:
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 件
関連記事
- 月と年を抽出するテーブルの作成方法
- すべてのテーブルOracle内のすべてのテーブルDMLアクティビティを検索するための動的クエリ
- マングース、default_languageでテキストインデックスを作成できません: 'none'
- JavaScript:オブジェクトからテーブルを作成するにはどうすればよいですか?
- VB PowerPointマクロ:テーブルを作成して参照します
- 一時テーブルを作成し、そこに挿入してから、pgsql関数内で選択します。
- openiddictのdbsetを作成できません
- 2つの日付の間の毎秒の日付テーブルを作成します
- zfsはスペース不足でスナップショットを作成できません
- ADTタイプの属性が1つあるDBのテーブルに挿入するにはどうすればよいですか? Oracle LiveSQLを使用
あなたの直接の質問に対する答えは、
ORA-01031: insufficient privileges
を取得することです ユーザーにはロールを介して付与されたCREATE TABLE権限があるため、Oracleセキュリティモデルは、PL/SQLのロールを介して付与された権限を使用できないというルールを実施します。そのため、DBAがユーザーにCREATE TABLE権限を直接付与する必要があります。それともあなたは?
あなたがしようとしていることは、Oracleでは意味をなさないからです。 Oracleでは、グローバル一時テーブルは恒久的 構造;一時的なのはそれらのデータだけです。したがって、他のデータベースオブジェクトと同様に、通常のDDLスクリプトを使用してテーブルを1回構築するのが正しい解決策です。その後、必要に応じてグローバル一時テーブルに挿入するだけです。
あなたはこのサイトでこの間違いを犯した最初の人ではありません(この関連するスレッドを読んでください)。多くの場合、人々は「一時テーブル」と呼ばれる構造を持つSQL Serverなどの別のデータベースから来ているため、実際にはOracleのグローバル一時テーブルとは異なります。それがあなたのシナリオなら、プライベート一時テーブルと呼ばれるOracle 18cの新機能に興味があります。これらは、SQL Serverの一時テーブルとまったく同じです。詳細をご覧ください。