如何在 Oracle 中更改模式的默认表空间

问题描述

一个叫做 Docker 的 schema,里面有名为 TABLE2、TABLE3 的表。

示例

SELECT * FROM all_all_tables WHERE TABLE_name= 'TABLE3';

此外,Docker 架构属于 DEFAULT TABLESPACE SYstem 表空间。

select 
    username,default_tablespace from dba_users WHERE USERNAME = 'DOCKER';

以下语法用于更改架构的认表空间。 (TS3 表空间已经存在)

ALTER USER docker DEFAULT tablespace TS3;

然后,当我再次搜索时,发现DEFAULT TABLESPACE被更改了。

select 
    username,default_tablespace from dba_users WHERE USERNAME = 'DOCKER';

而且,当然,我还以为指定了 TABLE2 和 TABLE3 的表空间也会被改成 TS3,然后执行了下面的语句。

然而,表的表空间是SYstem,而不是TS3。我很好奇为什么它没有改变,我想知道如何改变。 SELECT * FROM all_all_tables WHERE TABLE_name='TABLE3';

解决方法

默认表空间就是这样——创建段时的默认值(通常是表或索引,但段可以是表的分区、物化视图或任何其他需要空间的东西)并且不要'不指定表空间。创建段并将其分配给特定表空间后,除非您移动它,否则它将保留在该表空间中。

假设您使用的是 12.2 或更高版本,因此可以选择在线移动(在其他版本中,您需要删除 online 关键字)

alter table table3
  move online tablespace ts3;

您需要为每张桌子都这样做。如果 system 表空间中还有索引,您也需要移动这些索引

alter index index_name
  rebuild online tablespace ts3;

根据涉及的表和索引的数量,您可能需要编写一些动态 SQL 来为您生成各种 alter tablealter index 语句。