如何为用户获取表空间中的可用空间(Oracle)

时间:2011-05-13 15:39:44

标签: oracle10g tablespace

我正在开发一个Web应用程序,我需要警告用户他们在给定的db用户的表空间中空间不足。 应用程序不知道db的系统用户的凭据,因此我无法查询dba_users,dba_free_space..etc等视图。

我的问题是,Oracle是否有办法让用户在他们的表空间中找出剩余的空间?

谢谢!

3 个答案:

答案 0 :(得分:18)

原谅我对这个问题的无知,因为我认为只有数据存储的可用视图是dba_free_space等。

我意识到对于已登录的用户,他们有user_free_space ..视图。 提到here的查询的修改版本将是我的问题的答案。

查询如下:(在记录用户的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为单位返回可用空间

答案 1 :(得分:2)

以具有必要权限的用户身份创建存储包。您可能必须创建一个新用户。将包上的EXECUTE授予需要它的任何用户。这些包需要具有访问DBA视图所需的所有过程和功能,但应仔细编码以避免访问“过多”信息。您可能希望在非特权用户的帐户中编写第二个包来封装逻辑。

答案 2 :(得分:1)

这可能非常复杂,因为用户很可能:

  1. 即使具有特权的表空间(包括其默认表空间)有足够的空间,也会收到“空间不足”错误。当它们插入到由用户没有配额的表空间上的其他用户拥有的表中时,可能会发生这种情况。在这种情况下,您的用户可能无法访问确定是否有可用空间所需的视图,
  2. 即使桌面空间上没有可用配额的空间,也可以继续插入数据 - 它们的默认表空间可能没有配额。
  3. 因此,除非你有一个相当简单的案例,否则你必须非常了解用户在更深层次上与数据库交互的方式,并从更加数据库整体的角度来看待自由空间。