如何为在用用户更改默认表空间

本文介绍了一种不使用导入导出工具如imp等操作,而是直接更新数据库内部表的方法来更改用户的默认表空间。通过创建新的表空间并更新user$表中的datats#字段,可以实现用户新建表时自动使用新的表空间。

如何为在用用户更改默认表空间
下面讲一个通过修改基表的方法来修改默认表空间的方法。
不用通过什么imp 一类的操作。
create user btgl identified by btgl ;

新建立表空间

create tablespace btgl_dt datafile 'd:/btgl_dt.ora' size 100M;

select * from v$tablespace;
查出 btgl_dt 的ts# 为17


update user$ set datats#=17 where name='BTGL'
COMMIT;
ALTER SYSTEM FLUSH SHARED_POOL;
然后当再建立新表的时候自动会到表空间btgl_dt 上。

<think> 我们正在讨论如何修改Oracle数据库的默认表空间。根据引用内容,我们知道从Oracle 10g开始,可以通过`alter database default tablespace`命令修改数据库级别的默认表空间,并且这个修改会影响那些创建时未指定默认表空间用户(即使用系统默认表空间用户)。同时,引用还提到,已经创建的用户如果最初没有指定默认表空间,那么他们的默认表空间也会被修改;如果用户创建时明确指定了非SYSTEM表空间,则不会改变。 步骤: 1. 首先,我们可以查询当前的默认表空间。 2. 然后,使用`alter database`命令修改默认表空间。 3. 修改后,可以再次查询确认。 另外,我们还可以修改已有用户默认表空间(针对单个用户),使用`alter user`命令。 下面详细说明: 一、查询当前数据库默认表空间 可以使用以下SQL查询: ```sql SELECT property_value FROM database_properties WHERE property_name = 'DEFAULT_PERMANENT_TABLESPACE'; ``` 二、修改数据库默认表空间(影响后续创建的用户) ```sql ALTER DATABASE DEFAULT TABLESPACE new_tablespace_name; ``` 三、修改已有用户默认表空间 如果我们想修改某个已有用户默认表空间,可以使用: ```sql ALTER USER username DEFAULT TABLESPACE new_tablespace_name; ``` 注意:修改数据库默认表空间后,之前创建的用户如果最初没有指定默认表空间(即使用了SYSTEM表空间),那么他们的默认表空间会自动更新为新的默认表空间。但是,如果用户创建时已经指定了非SYSTEM的某个表空间,则不会改变。 四、验证修改结果 1. 验证数据库默认表空间是否修改成功: ```sql SELECT property_value FROM database_properties WHERE property_name = 'DEFAULT_PERMANENT_TABLESPACE'; ``` 2. 验证某个用户默认表空间(比如用户名为USER1): ```sql SELECT username, default_tablespace FROM dba_users WHERE username = 'USER1'; ``` 五、注意事项 - 新的默认表空间必须已经存在。 - 修改默认表空间不会移动用户原有对象(已经存在的表等)到新的表空间,只影响以后创建的对象。如果需要移动已有对象,需要使用其他方法(如`alter table ... move tablespace ...`等)。 六、补充:创建表空间和用户 如果需要创建一个新的表空间并指定给用户,可以参考引用[3]: 1. 创建表空间: ```sql CREATE TABLESPACE new_ts DATAFILE 'D:\xinyuan\oracledata\new_ts.dbf' SIZE 50M AUTOEXTEND ON NEXT 10M MAXSIZE 400M EXTENT MANAGEMENT LOCAL; ``` 2. 创建用户并指定表空间: ```sql CREATE USER new_user IDENTIFIED BY password DEFAULT TABLESPACE new_ts; ``` 3. 授权: ```sql GRANT DBA TO new_user; -- 或者根据需要授权 ``` 七、修改数据库默认表空间的影响范围(引用[2]) 修改数据库默认表空间后: - 对于已经创建的普通用户: - 如果创建用户时没有指定默认表空间(即使用SYSTEM表空间),那么该用户默认表空间会被修改为新的默认表空间。 - 如果创建用户时指定了非SYSTEM表空间(比如指定了一个具体的表空间),那么该用户默认表空间不会改变。 - 如果创建用户时指定了SYSTEM表空间(虽然不推荐),那么该用户默认表空间也会被修改为新的默认表空间。 因此,如果我们需要将所有用户默认表空间修改为新的表空间,那么需要分别处理: - 修改数据库默认表空间(影响以后创建的用户和之前使用SYSTEM表空间的用户)。 - 对于之前已经指定了非SYSTEM表空间的用户,使用`ALTER USER`逐个修改。 八、如何批量修改用户默认表空间 我们可以编写PL/SQL块来批量修改: ```sql BEGIN FOR user_rec IN (SELECT username FROM dba_users WHERE default_tablespace = 'OLD_TS') LOOP EXECUTE IMMEDIATE 'ALTER USER ' || user_rec.username || ' DEFAULT TABLESPACE NEW_TS'; END LOOP; END; / ``` 注意:这里我们只修改那些默认表空间为'OLD_TS'的用户。当然,也可以根据其他条件来过滤。 总结: 1. 修改数据库默认表空间:`ALTER DATABASE DEFAULT TABLESPACE new_tablespace;` 2. 修改单个用户默认表空间:`ALTER USER username DEFAULT TABLESPACE new_tablespace;` 3. 注意:修改数据库默认表空间不会移动用户已有的数据,只影响以后创建的对象。 参考资料: [^1]: 实例讲解Oracle数据库设置默认表空间问题 [^2]: 当修改Oracle数据库的默认表空间后,原用户默认表空间会变化吗? [^3]: Oracle数据库新建默认表空间并指定用户 [^4]: 修改Oracle用户默认表空间 [^5]: Oracle数据库的表空间创建和数据库表创建 下面生成相关问题: </think> ### 修改 Oracle 数据库默认表空间的方法 #### 一、查询当前默认表空间 ```sql -- 查看数据库级默认表空间 SELECT property_name, property_value FROM database_properties WHERE property_name = 'DEFAULT_PERMANENT_TABLESPACE'; -- 查看用户默认表空间 SELECT username, default_tablespace FROM dba_users WHERE username = 'YOUR_USERNAME'; -- 替换为实际用户名 ``` > 结果示例:[^1][^4] > `DEFAULT_PERMANENT_TABLESPACE | USERS` #### 二、修改数据库级默认表空间(影响后续创建的用户) ```sql ALTER DATABASE DEFAULT TABLESPACE NEW_TS; -- NEW_TS为新表空间名 ``` **效果**:[^2] 1. 新创建的用户自动使用此表空间 2. **已有用户**: - 若原默认表空间为`SYSTEM` → 自动更新为新表空间 - 若原已指定非`SYSTEM`表空间 → 保持不变 #### 三、修改特定用户默认表空间 ```sql ALTER USER target_user DEFAULT TABLESPACE NEW_TS; ``` **适用场景**: - 修改单个用户的默认存储位置 - 解决历史遗留的`SYSTEM`表空间误用问题[^1] #### 四、操作示例完整流程 1. **创建新表空间**: ```sql CREATE TABLESPACE APP_DATA DATAFILE '/u01/oradata/ORCL/app_data01.dbf' SIZE 500M AUTOEXTEND ON; ``` 2. **修改数据库默认表空间**: ```sql ALTER DATABASE DEFAULT TABLESPACE APP_DATA; ``` 3. **修改现有用户表空间**: ```sql ALTER USER scott DEFAULT TABLESPACE APP_DATA; ``` 4. **验证修改结果**: ```sql -- 检查数据库级默认 SELECT property_value FROM database_properties WHERE property_name='DEFAULT_PERMANENT_TABLESPACE'; -- 检查用户级默认 SELECT username, default_tablespace FROM dba_users; ``` --- ### 🔍 关键注意事项 1. **不影响现有对象** 修改仅影响**后续创建**的对象,已有对象仍存储在原始表空间中。如需迁移需显式执行: ```sql ALTER TABLE my_table MOVE TABLESPACE APP_DATA; ``` 2. **权限要求** 需具备`ALTER DATABASE`或`ALTER USER`系统权限: ```sql GRANT ALTER DATABASE TO admin_user; ``` 3. **表空间状态检查** 确保新表空间在线且有足够空间: ```sql SELECT tablespace_name, status, bytes/1024/1024 "SIZE_MB" FROM dba_tablespaces JOIN dba_data_files USING(tablespace_name); ``` 4. **SYSTEM表空间保护** 禁止将用户对象默认存储到`SYSTEM`表空间(性能与安全风险)[^1][^2]: ```sql -- 强制修正所有SYSTEM用户 BEGIN FOR u IN (SELECT username FROM dba_users WHERE default_tablespace='SYSTEM' AND username NOT IN ('SYS','SYSTEM')) LOOP EXECUTE IMMEDIATE 'ALTER USER '||u.username||' DEFAULT TABLESPACE USERS'; END LOOP; END; ``` --- ### 💡 最佳实践建议 1. **生产环境规范** - 创建数据库后立即修改默认表空间: ```sql CREATE DATABASE ... DEFAULT TABLESPACE users; ``` - 分离系统数据与用户数据(最少创建`SYSTEM`, `SYSAUX`, `USERS`, `TEMP`四个表空间) 2. **多租户环境(CDB/PDB)** 在PDB级别修改默认表空间: ```sql ALTER SESSION SET CONTAINER=orclpdb; ALTER DATABASE DEFAULT TABLESPACE app_ts; ``` 3. **空间监控脚本** ```sql SELECT tablespace_name, ROUND(used_space/1024/1024) "USED_MB", ROUND(tablespace_size/1024/1024) "TOTAL_MB" FROM dba_tablespace_usage_metrics; ``` > 📌 **重要**:修改默认表空间后,应立即检查`DB_DEFAULT`参数是否同步更新[^4]: > ```sql > SELECT * FROM database_properties > WHERE property_name LIKE '%DEFAULT%'; > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值