【问题标题】:What tablespace are Oracle sequences stored in?Oracle 序列存储在哪个表空间中?
【发布时间】:2009-01-11 14:23:03
【问题描述】:

我和我的同事维护的应用程序在后端有一个 Oracle 数据库。我们正在考虑偶尔以“受限”模式运行应用程序,其中一个数据库表空间设置为只读。我们可以轻松地将必要的表和索引移动到单独的表空间中,这些表空间将在“受限”模式下可写。但是,尽管进行了多次 Google 搜索,我仍无法确定 Oracle 在哪个表空间中存储序列。

This answer 提到序列值存储在 SYSTEM.SEQ$ 表中。我现在无法访问 Oracle 数据库,但我猜这个表存在于系统表空间之一中。我们设置为只读的表空间不是系统表空间,而是我们自己的数据表空间之一。

在开发数据库上,我可以成功地从相关表空间设为只读的序列中选择。

我怀疑让这个表空间只读不会有问题,但我宁愿我的怀疑得到证实,而不仅仅是临时实验。有人可以请教我吗?

【问题讨论】:

  • 也许您应该考虑通过 GRANT/REVOKE 修改权限,而不是采用这种表空间方法。特权旨在让您控制谁可以插入/更新/删除/选择,而不是表空间。

标签: oracle sequence


【解决方案1】:

序列(大部分)在 SEQ$ 中。零件将在 OBJ$ 中(以及其他地方的赠款)。 但是所有这些表都在 SYSTEM 表空间中。一些 SYSTEM 对象位于 SYSAUX 中。 DBA_SEGMENTS 是识别对象(例如 SEQ$)驻留在哪些表空间中的好视图。

我怀疑 Oracle 不会让您将这些表空间设置为只读模式,因为要这样做,它需要将该表空间标记为只读,该表空间记录在该表空间的 SYSTEM 表中。有点像把钥匙锁在它解锁的保险箱里。

【讨论】:

    【解决方案2】:

    我猜是系统,还有哪里可以存储这些信息?

    但是你为什么想知道这个?如果表空间是只读的,则无法插入或更新,因此您根本不必使用序列。

    【讨论】:

    • 有些表在“受限”模式下是可写的,所以我们需要生成它们的 PK 的序列是可更新的而不是只读的。
    【解决方案3】:

    我现在没有 Oracle 数据库,如果我没记错的话,序列是数据字典的一部分,因此无法手动更新,甚至无法(简单)查询没有特殊的语法(这就是为什么您不能简单地获取序列的当前值 - 您必须递增它)。 显然,数据字典是 SYSTEM 表空间的一部分,应该以任何方式触及。

    【讨论】:

    • 其实你可以使用“sequence.CURRVAL”得到一个序列的当前值,例如select seq.currval into v_current_value from dual;
    • 并非总是如此 - 如果您尚未选择 sequence.NEXTVAL,您可能会收到 ORA-08002 错误。如果需要序列的当前值,可以在 ALL_SEQUENCES 中查找。
    • 不正确 - 您无法从 ALL_SEQUENCES 中获取当前值。此视图具有 min/max/cache/increment 和 LAST_NUMBER,与当前值不同。一旦使用 NEXTVAL 初始化序列,您就可以从 CURRVAL 获取当前值。
    猜你喜欢
    • 2016-06-03
    • 2011-01-22
    • 1970-01-01
    • 2021-05-21
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多