oracle中的user和schema

本文详细解析了Oracle数据库中user与schema的区别,并通过实例演示如何使用altersession切换模式,以及如何访问不同模式下的对象。

前言: user是控制权限的, 而schema则是一个容器,非所有者如果需要访问这个容器下的对象就需要在对象前面写上schema(owner)的名字,如果不想写而又没有创建 synonym,此时可以通过alter session set current_schema=schema_name来改变当前session的schema从而在访问对象时省去schema(owner);最终能 否访问对象还是要看是否有访问这个对象的权限而和schema无关。

深入理解user和schema的区别:

user即Oracle中的用户,和所有系统的中用户概念类似,用户所持有的是系统的权限及资源;

而schema所涵盖的是各种对象,它包含了表、函数、包等等对象的“所在地”,并不包括对他们的权限控制。

好比一个房子,里面放满了家具,对这些家具有支配权的是房子的主人(user),而不是房子(schema)。

你可以也是一个房子的主人(user),拥有自己的房子(schema)。可以通过alter session的方式进入别人的房子。

这个时候,你可以看到别人房子里的家具(desc)。

如果你没有特别指定的话,你所做的操作都是针对你当前所在房子中的东西。

至于你是否有权限使用(select)、搬动(update)或者拿走(delete)这些家具就看这个房子的主人有没有给你这样的权限了,或者你是整个大厦(DB)的老大(DBA)。alter session set schema可以用来代替synonyms。

如果你想调用其他schema的对象(有权限的前提下),但并没有建synonym,同时又不想把其他schema名字放入代码中,就可以首先使用alter session set schema=<其他schema名字>。

 

 

SQL> connect /as sysdba
已连接。

SQL> revoke dba from xys,test;
revoke dba from xys,test
*
第 1 行出现错误:
ORA-01951: ROLE 'DBA' 未授予 'XYS'


SQL> revoke dba from test;

撤销成功。

SQL> connect xys/manager
已连接。
SQL> select table_name from user_tables;

未选定行

SQL> create table t(id int) ;

表已创建。

SQL> insert into t values(1);

已创建 1 行。

SQL> commit;

提交完成。

SQL> connect test/test
已连接。
SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
T
TT
SYS_TEMP_FBT

SQL> desc t
名称 是否为空? 类型
--------------- -------- -------------

ID NUMBER(38)

SQL> select * from t;

未选定行

SQL> show user
USER 为 "TEST"
SQL> select * from xys.t;
select * from xys.t
*
第 1 行出现错误:
ORA-00942: 表或视图不存在

SQL> alter session set current_schema=xys;

会话已更改。

SQL> show user
USER 为 "TEST"
SQL> select * from xys.t;
select * from xys.t
*
第 1 行出现错误:
ORA-00942: 表或视图不存在


SQL> select * from t;
select * from t
*
第 1 行出现错误:
ORA-00942: 表或视图不存在

SQL> alter session set current_schema=TEST;

会话已更改。

SQL> select * from t;

未选定行

SQL> connect xys/manager
已连接。
SQL> grant select on t to test;

授权成功。

SQL> connect test/test
已连接。
SQL> select * from xys.t;

ID
----------
1

SQL> alter session set current_schema=xys;

会话已更改。

SQL> select * from t;

ID
----------
1

SQL>
在使用 ShardingSphere 进行分库分表时,处理 Oracle 数据库中特定 USER schema 的数据分片问题是一个较为常见的需求。Oracle 本身支持多用户 schema 的管理机制,因此在配置 ShardingSphere 时需要特别注意对 schema 名称的指定与处理。 ### 配置 Oracle 数据库 USER schema 支持 1. **逻辑数据源与真实数据源的映射** 在 ShardingSphere 的配置文件中,可以通过 `dataSources` 配置项定义多个数据库实例,并通过 `spring.shardingsphere.datasource` 指定具体的连接信息。对于 Oracle 数据库中的特定 USER schema,通常的做法是将 schema 名称包含在 JDBC URL 中,或者在 SQL 查询中显式指定 schema 名称[^4]。例如: ```yaml spring: shardingsphere: datasource: names: ds0,ds1 ds0: driver-class-name: oracle.jdbc.OracleDriver url: jdbc:oracle:thin:@localhost:1521:orcl username: user0 password: pass0 ds1: driver-class-name: oracle.jdbc.OracleDriver url: jdbc:oracle:thin:@localhost:1521:orcl username: user1 password: pass1 ``` 上述配置中,`user0` `user1` 是 Oracle 中的不同 USER,它们各自拥有独立的 schema。 2. **逻辑表与真实表的映射** 在进行分片配置时,可以使用 `tables` 配置项来定义逻辑表与实际表之间的映射关系。如果不同的 USER schema 中存在相同的表结构,则可以在每个数据源中分别定义这些表,并通过 `actual-data-nodes` 指定对应的分片节点。例如: ```yaml tables: t_order: actual-data-nodes: ds$->{0..1}.t_order_$->{0..1} table-strategy: standard: sharding-column: order_id sharding-algorithm-name: t-order-table-inline key-generator: type: SNOWFLAKE ``` 此配置表示 `t_order` 表将被分片到 `ds0` `ds1` 数据源中的 `t_order_0` `t_order_1` 表中。每个数据源对应一个特定的 USER schema。 3. **SQL 中显式指定 schema 名称** 如果业务逻辑要求在查询中显式指定 schema 名称,则可以在 SQL 语句中直接写入 schema 名称,如 `SELECT * FROM user0.t_order`。ShardingSphere 会根据当前连接的数据源自动识别对应的 schema,并执行相应的分片策略[^3]。 4. **分片键的选择与算法配置** 分片键的选择直接影响到数据分布的均匀性查询性能。可以选择 `order_id` 或其他字段作为分片键,并通过 `sharding-algorithm` 定义分片规则。常用的分片算法包括 `INLINE`、`HASH_MOD` 等。例如: ```yaml sharding-algorithms: t-order-table-inline: type: INLINE props: algorithm-expression: t_order_$->{order_id % 2} ``` 该配置表示根据 `order_id` 对 2 取模的结果决定数据存储在哪个分片中。 5. **全局主键与分布式事务** 在分库分表场景下,全局主键的生成分布式事务的处理也是不可忽视的问题。ShardingSphere 提供了多种主键生成策略(如 `SNOWFLAKE`、`UUID`)以及对 XA 柔性事务的支持,确保在跨库操作时的数据一致性[^4]。 6. **注意事项** - 确保每个数据源的用户名(USER)具有足够的权限访问其对应的 schema。 - 在配置文件中正确设置 `username` `password`,以保证连接池能够成功建立连接。 - 如果不同 USER schema 中的表结构不一致,建议使用不同的逻辑表名或通过视图统一接口,避免因结构差异导致查询失败。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值