web-dev-qa-db-ja.com

ユーザーがテーブルスペースで使用可能なスペースを取得する方法(Oracle)

指定されたdbユーザーのテーブルスペースのスペースが不足していることをユーザーに警告する必要があるWebアプリケーションに取り組んでいます。アプリケーションはdbのシステムユーザーの資格情報を知らないため、dba_users、dba_free_space..etcなどのビューをクエリできません。

私の質問は、Oracleに、ユーザーがテーブルスペースに残っているスペースの量を確認する方法はありますか?

ありがとう!

9
Emrah

データストレージで利用できるビューはdba_free_spaceなどだけだと信じていたので、この件についての私の無知を許してください。

ログに記録されたユーザーには、user_free_space ..ビューがあることに気付きました。言及されたクエリの修正バージョン ここ が私の質問の答えになります。

クエリは次のとおりです:(ログに記録されたユーザーのDEFAULT_TABLESPACEに残っているスペースを取得する)

SELECT
  ts.tablespace_name,
  TO_CHAR(SUM(NVL(fs.bytes,0))/1024/1024, '99,999,990.99') AS MB_FREE
FROM
  user_free_space fs,
  user_tablespaces ts,
  user_users us
WHERE
  fs.tablespace_name(+)   = ts.tablespace_name
AND ts.tablespace_name(+) = us.default_tablespace
GROUP BY
  ts.tablespace_name;

MB単位で空き領域を返します

19
Emrah

必要な権限を持つユーザーとして保存パッケージを作成します。新しいユーザーを作成する必要がある場合があります。パッケージを必要とするすべてのユーザーに、パッケージのEXECUTEを付与します。パッケージには、DBAビューにアクセスするために必要なすべての手順と機能が含まれている必要がありますが、「多すぎる」情報にアクセスしないように注意深くコーディングする必要があります。ロジックをカプセル化するために、非特権ユーザーのアカウントに2番目のパッケージを作成することをお勧めします。

2
redcayuga

ユーザーが次のことを行う可能性が非常に高いため、これは潜在的に非常に複雑です。

  1. デフォルトのテーブルスペースを含め、権限を持つテーブルスペースに十分なスペースがある場合でも、「スペース不足」エラーを受け取ります。これは、ユーザーにクォータがないテーブルスペースにある別のユーザーが所有するテーブルにユーザーが挿入した場合に発生する可能性があります。この場合、ユーザーはおそらく、空き領域があるかどうかを判断するために必要なビューにアクセスできません。
  2. クォータがあるテーブルスペースに空き領域がない場合でも、データの挿入を続行できます。デフォルトのテーブルスペースにもクォータがない場合があります。

したがって、かなり単純なケースがない限り、ユーザーがデータベースをはるかに深いレベルで操作する方法を十分に認識し、データベース全体の観点から空き領域を確認する必要があります。

1
David Aldridge