current_schema参数的用途

简介: 用户A包含表TBL,如果用户A将TBL的访问权限给用户B(grant selectany table to B),则在用户B中要想引用用户A的表,不使用同义词,则需要用select * from A.

用户A包含表TBL,如果用户A将TBL的访问权限给用户B(grant select any table to B),则在用户B中要想引用用户A的表,不使用同义词,则需要用select * from A.TBL;


之所以这里需要使用A.TBL的格式,是因为TBL表属于用户A的schema,做个比喻,schema(译文方案)好比一个容器,存放的是一系列数据库对象,从官方文档的介绍说明:

“A schema is a collection of database objects. A schema is owned by a database user and has the same name as that user. Schema objects are the logical structures that directly refer to the database’s data. Schema objects include structures like tables, views, and indexes. (There is no relationship between a tablespace and a schema. Objects in the same schema can be in different tablespaces, and a tablespace can hold objects from different schemas.)”

从中可以总结几点

1. 一个schema由一个数据库用户拥有,并且具有和那个用户相同的名字。

2. schema对象是一种逻辑结构。

3. 表空间和schema之间没有关系。

4. 同一个schema中的对象可以存在于不同的表空间,一个表空间可以拥有多个schema的对象。


再借鉴一个比喻,schema好比一个房间,房间中有各种各样的对象,例如桌子、椅子,房间的主人就是user/owner,他默认拥有这个房间内所有对象的增搬拆权限,但同样只有他可以让另外一个人进入房间,这就是授权。


有点扯远了,上面说到用户B要引用用户A的表,不想使用“用户A.表”的形式,其实除了使用同义词外,还可以使用current_schema来改变当前用户使用的schema。

语法:alter session set current_schema=名称;

尽管当前模式转换了,但是否有读写权限取决于用户是否被授权了,换句话说,这个语句并不能决定改变了shcema,这个用户就有新的schema中对象的读写权限。


实验

1. 用户A授权用户B

grant select any table to B;

2. 修改用户A当前session的shcema为A

alter session set current_schema=A;

3. 查看当前session的schema

select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') CURRENT_SCHEMA from dual;

>A

show user

USER is "TEST_PRIV"

4. 查看A的TBL

select * from TBL;

一切OK。

5. 切换当前session的schema为sys

alter session set current_schema=sys;

select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') CURRENT_SCHEMA from dual;
>SYS

6. 查看dba_tables

select * from dba_tables;

ERROR at line 1:

ORA-00942: table or view does not exist

说明用户B无权访问SYS对象。


总结

其实之所以需要current_schema,主要是申请一些只读账户时,通常是用grant授予用户访问权限,但访问时如果没有同义词则需要是用“schema(/user).表的方式,每次新建表都创建同义词的方法也行,但毕竟很是不方便,是用current_schema就很简单了。

Oracle提供了各种通用或细节的技术手段,目标还是为了方便用户的使用,因此我觉得当有个问题感觉用起来不爽的时候,可以找下是否有workround,作为一个好的软件,应该会在你想到之前就已经考虑了这个问题了:)

目录
相关文章
|
存储 监控 安全
解锁ThreadLocal的问题集:如何规避多线程中的坑
解锁ThreadLocal的问题集:如何规避多线程中的坑
740 0
|
SQL XML Java
若依框架 --- 使用数据权限功能
若依框架 --- 使用数据权限功能
1739 0
|
12月前
|
搜索推荐 Java API
探索Java中的Lambda表达式
本文将深入探讨Java 8引入的Lambda表达式,这一特性极大地简化了代码编写,提高了程序的可读性。通过实例分析,我们将了解Lambda表达式的基本概念、使用场景以及如何优雅地重构传统代码。文章不仅适合初学者,也能帮助有经验的开发者加深对Lambda表达式的理解。
|
SQL 关系型数据库 MySQL
(十八)MySQL排查篇:该如何定位并解决线上突发的Bug与疑难杂症?
前面《MySQL优化篇》、《SQL优化篇》两章中,聊到了关于数据库性能优化的话题,而本文则再来聊一聊关于MySQL线上排查方面的话题。线上排查、性能优化等内容是面试过程中的“常客”,而对于线上遇到的“疑难杂症”,需要通过理性的思维去分析问题、排查问题、定位问题,最后再着手解决问题,同时,如果解决掉所遇到的问题或瓶颈后,也可以在能力范围之内尝试最优解以及适当考虑拓展性。
1121 3
|
数据采集 自然语言处理 搜索推荐
python 【包含数据预处理】基于词频生成词云图
这段文本是关于如何使用Python基于词频生成词云图的教程。内容包括:1) 中文分词的必要性,因中文无明显单词边界及语言单位特性;2) 文本预处理步骤,如移除特殊符号、网址、日期等;3) 使用`data_process`函数清除无用字符;4) `getText`函数读取并处理文本为句子数组;5) 使用jieba分词库进行分词和词频统计;6) 示例代码展示了从分词到生成词云的完整流程,最后展示生成的词云图。整个过程旨在从中文文本中提取关键词并可视化。
739 5
python 【包含数据预处理】基于词频生成词云图
|
SQL 存储 数据安全/隐私保护
MyBatis-Plus演绎:数据权限控制,优雅至极!
项目使用mybaits-plus,所以在mybaits-plus的基础上增加数据权限的过滤 mybaits-plus自带数据权限支持,但由于系统数据权限相对复杂,通过查看文档发现好像并不适用,且原项目版本低,所以最终还是通过自己的方式实现
1820 1
MyBatis-Plus演绎:数据权限控制,优雅至极!
|
Linux 网络安全 Docker
安装后无法使用 Docker 命令
【10月更文挑战第3天】
1353 2
|
Dubbo IDE Java
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
这篇文章是关于如何下载和部署Dubbo管理控制台(dubbo-admin)的教程,并分析了2.6.1版本及以后版本的变化。
898 0
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
|
人工智能 搜索推荐 API
使用 Python holidays 库获取中国节日
使用 Python holidays 库获取中国节日
1187 2
|
关系型数据库 Nacos 数据库
如何使用Docker部署Nacos服务?Nacos Docker 快速部署指南: 一站式部署与配置教程
如何使用Docker部署Nacos服务?Nacos Docker 快速部署指南: 一站式部署与配置教程
2212 1