current_schema参数的用途

用户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,作为一个好的软件,应该会在你想到之前就已经考虑了这个问题了:)

时间: 2024-08-13 10:12:05

current_schema参数的用途的相关文章

ORACLE NLS_LENGTH_SEMANTICS 参数的用途

NLS_LENGTH_SEMANTICS参数是一个专为创建CHAR和VARCHAR2两种字符型的列时,指定使用的字节长度,还是使用字符长度的定义方式,有byte和char两种值,默认为byte. 当设置该参数为BYTE时,定义CHAR列或VARCHAR2列采用字节长度方式:当设置该参数为CHAR时,定义CHAR列或VARCHAR2列采用字符长度的方式.该参数对于数据库中已经存在的列不具备任何用途,只是在创建表,或修改表的列时才具有意义. NLS_LENGTH_SEMANTICS参数的值,不对已经

easyUI Datagrid 控件 param参数的用途探索

关于easyUI Datagrid  控件 param参数,官方文本很少解释,主要有如下说明: queryParams object When request remote data, sending additional parameters also. Code example: $('#dg').datagrid({ queryParams: { name: 'easyui', subject: 'datagrid' } }); 有人认为这个参数可有可无,比如: queryParams这个

ref参数的用途

ref参数 能够将一个变量带入方法进行改变,改变完成后再将改变完成后的变量带出方法 ref参数要求在方法外必须为值赋值,而方法内可以不赋值 static void Main(string[] arr) { int gongzi = 5000; JiangJin(ref gongzi); Console.WriteLine(gongzi); Console.ReadKey(); } public static void JiangJin(ref int n1) { n1 = n1 + 500; }

TCP SOCKET中backlog参数的用途是什么? ---图解

https://www.frozentux.net/ipsysctl-tutorial/chunkyhtml/tcpvariables.html http://www.cnxct.com/something-about-phpfpm-s-backlog/ http://tech.uc.cn/?p=1790 在前年时,业务中遇到好多次因为PHP-FPM的backlog参数引发的性能问题,一直想去详细研究一番,还特意在2013年总结里提到这事<为何PHP5.5.6中fpm backlog Chang

关于.Net中Process的使用方法和各种用途汇总

简介: .Net中Process类功能十分强大.它可以接受程序路径启动程序,接受文件路径使用默认程序打开文件,接受超链接自动使用默认浏览器打开链接,或者打开指定文件夹等等功能. 想要使用Process类之前,需要先引用using System.Diagnostics; Process类用法1: Process类有很多种使用方式,比如我只想打开一个应用程序的话,直接调用Process.Start("应用的路径");即可打开对用的应用程序,用默认程序打开文件,打开超链接,打开文件夹也都只用

正则中的括号()的用途(匹配子项或是分组)

首先我们前面介绍过,replace()方法中的第二个参数若是回调函数,那么这个回调函数中的参数就是匹配成功后的结果.....,那么有没有考虑回调函数中有多个参数呢? 先举个例子: <!DOCTYPE> <html> <head> <meta charset='utf-8'> <title></title> </head> <script type="text/javascript"> win

纠正要求修改数据库NLS_LENGTH_SEMANTICS参数的错误要求

1.开发人员错误的要求 先看一封开发人员向某DBA提出的一个"要求修改数据库NLS_LENGTH_SEMANTICS参数"的邮件: 上面邮件,出于对隐私的保护,对发件人,收件人,数据库名称进行了隐涂. 邮件内容主要意思是: (1)   源端和目标端数据库的字符集均为SIMPLIFIED CHINESE_CHINA.UTF8,但是源端数据库NLS_LENGTH_SEMANTICS参数的值为char,目标数据库NLS_LENGTH_SEMANTICS参数的值为byte (2)   邮件中对

C++中参数缺省和引用

本篇文章将整理出关于参数缺省和引用的一些知识. (一)参数缺省:参数缺省包括全缺省和半缺省.顾名思义,全缺省就是函数的所有参数都给出默认值,半缺省就是仅有函数的部分参数给出了默认值.看下边的一段代码: #include<iostream>   using namespace std;      int Add(int x, int y)   {       return x + y;   }   int main()   {       int ret = Add();       syste

【转】Oracle 11g Dataguard 参数详解

转自:https://www.jb51.net/article/52269.htm 这篇文章主要介绍了Oracle 11g Dataguard参数详解,包含了独立参数.主库参数.备库参数的详细说明,需要的朋友可以参考下. 注:本文译自<Oracle Data Guard 11g Handbook> Page 78 – Page 88 就Data Guard(后面都写成DG)来说,我们只关注如下三种参数: 1.独立于数据库角色的参数2.数据库角色为primary时的参数3.数据库角色为stand