【问题标题】:How to get available space in tablespace for a user (Oracle)如何为用户获取表空间中的可用空间(Oracle)
【发布时间】:2011-05-13 15:39:43
【问题描述】:

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

我的问题是,Oracle 中是否有办法让用户找出他们的表空间中还有多少空间留给他们?

谢谢!

【问题讨论】:

    标签: oracle10g tablespace


    【解决方案1】:

    请原谅我对这个主题的无知,因为我认为只有 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 为单位的可用空间

    【讨论】:

    • 谢谢,不知道。我知道 user_tables 和类似的视图,但不知道那个。
    • 它将返回以 MB 为单位的可用空间乘以 user_users 中具有特定表空间为 default_tablespace 的用户数量。因此,只有当 user_users 每个连接表空间恰好包含一行时,它才能正常工作。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,我想我找到了另一个解决方案。
    【解决方案3】:

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

    1. 即使他们拥有权限的表空间(包括其默认表空间)有足够的空间,也会收到“空间不足”错误。当他们插入到由不同用户拥有的表中时,可能会发生这种情况,该表位于您的用户没有配额的表空间上。在这种情况下,您的用户可能无法访问确定是否有可用空间所需的视图,
    2. 即使具有配额的表空间上没有可用空间,也能够继续插入数据 - 他们甚至可能在其默认表空间上没有配额。

    因此,除非您有一个相当简单的案例,否则您真的必须非常了解用户在更深层次上与数据库交互的方式,并从更全面的数据库角度看待可用空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多