改变当前模式的会话

时间:2016-07-29 12:33:00

标签: sql oracle11g

假设它们是两个数据库环境(prod legacy和prd exadata)。我是用户,并且对具有相同模式名称A的两个db都具有select权限。

我当前的会话是“prod legacy”

如果我运行alter session set current_schema = A;

我正在访问哪种架构:旧版或exadata?为什么呢?

此外,我可以访问架构B.

如果我运行alter session set current_schema = B;

为什么我能够根据A的架构配置访问架构B.

注意:我正在使用SQL Developer

1 个答案:

答案 0 :(得分:0)

数据库由多个模式组成(btw,在Oracle中,模式与用户几乎相同),每个模式可以包含不同的对象,例如表,视图等。

您连接的数据库取决于您在建立数据库会话时使用的连接字符串,并且在该会话的生命周期内无法更改。

假设在您的数据库中,您有2个架构(用户):AB,它们都包含一个名为tbl的表。查询时:

select * from tbl

...哪一个查询?这就是current_schema设置的用武之地。默认情况下,它是您连接的用户的架构。因此,如果您与用户A建立了关联,则默认情况下您将查询A.tbl

如果您希望在用户B.tbl连接时查询A,则有2个选项:

  1. 在编写查询时,您始终可以使用所需的架构显式限定表名。例如:select * from B.tbl
  2. 您可以使用alter session set current_schema = B命令将默认架构更改为B,这样当您说select * from tbl时,它会自动将其转换为select * from B.tbl
  3. 另请注意,仅使用alter session set current_schema命令不会自动授予您对该架构的对象的权限。当您没有明确限定对象名称时,它所做的就是以不同方式解释您的查询。但是您需要被授予成功查询这些对象的必要权限。