学习Oracle Concepts-第4章 分区、视图和其他模式对象

内容主要来源于Oracle官方文档(官网英文版和网络中文版)
Oracle Database Concepts

1.分区概述

分区能够将非常大的表或这索引分解成更小的、更易于管理的叫做 分区 的片段。每个分区是一个独立的对象,有其自己的名称和可选择的存储选项。
从程序的角度看,分区表是一个单独的模式对象。DML语句不需要修改就可以像访问非分区表那样访问分区表。
分区对需要管理大量数据的应用程序特别有用,好处有:
1.可用性增强:单独的分区不可用不会导致整个对象不可用。当部分分区不可用时,优化器会自动删除未引用的分区,所以当分区不可用时查询不会受影响;
2.更轻松地管理模式对象:分区对象有多个分片,这些分片能作为整体管理,也可以单独管理。DDL语句可以操作分区,而不是整个表或索引。因此能分解占用大量资源的任务,如重建索引或表。例如,可以一次只移动一个表分区。如果发生了问题,可以只有分区被移动,而不必移动整个表。删除分区可以避免执行多个delete语句
3.减少OLTP系统的共享资源争用:DML被分散到多个段而不是一个段;
4.提高数据仓库的查询性能:在数据仓库中,分区可以加快即席查询(自定义查询需求的查询)的处理;

1.1 分区特征

每个表或索引的分区必须具有相同的逻辑属性,比如列名、数据类型和约束,但每个分区可以有单独的物理属性,比如单独所属表空间。

分区键

分区键是一个列或者列集合,用来确定分区表中的行应该在哪个分区。每个行会被确定的分配到某个分区。

分区策略

Oracle提供了几个分区策略,来控制数据库怎样把数据分配到分区。基本策略是范围、列表和哈希分区。
单一分区策略只使用一种数据分布方法。复合分区中,先按照一种数据分布方法进行分区,然后每个分区按照第二种数据分布方法进一步分成子分区。
范围分区
在范围分区中,数据库根据分区键值的范围将行映射到各个分区。范围分区是最常用的分区,通常与日期一起使用。
示例:创建一个以time_id为分区键的范围分区表time_range_sales:

CREATE TABLE time_range_sales
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, channel_id CHAR(1)
, promo_id NUMBER(6)
, quantity_sold NUMBER(3)
, amount_sold NUMBER(10,2)
)
PARTITION BY RANGE (time_id)
(PARTITION SALES_1998 VALUES LESS THAN (TO_DATE('01-JAN-1999','DD-MON-YYYY')),
PARTITION SALES_1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY')),
PARTITION SALES_2000 VALUES LESS THAN (TO_DATE('01-JAN-2001','DD-MON-YYYY')),
PARTITION SALES_2001 VALUES LESS THAN (MAXVALUE)
);

加载数据时,数据库根据time_id为每个行选择适当的分区:
学习Oracle Concepts-第4章 分区、视图和其他模式对象_第1张图片
范围分区的键值确定各个范围分区的高值,被称为跃点。分区sales_1998包含分区键time_id值小于跃点01-JAN-1999 的行。
数据库为超出跃点的数据创建间隔分区。当插入到表中的数据超出所有已定义的表分区时,间隔分区通过指示数据库自动创建特定范围或间隔的分区 来扩展范围分区。分区sales_2001包含分区键time_id大于或等于01-JAN-2001的行。

列表分区
在列表分区中,数据库使用一些具体值的列表作为每个分区的分区键。可以使用列表来控制单个行如何映射到特定的分区。当区分数据的键不方便排序时,通过使用列表来分组和组织数据集。
创建一个以channel_id为分区键的列表分区list_sales:

CREATE TABLE list_sales
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, channel_id CHAR(1)
, promo_id NUMBER(6)
, quantity_sold NUMBER(3)
, amount_sold NUMBER(10,2)
)
PARTITION BY LIST (channel_id)
(PARTITION even_channels VALUES (2,4),
PARTITION odd_channels VALUES (3,9)
);

加载数据的时候,数据库根据PARTITION BY LIST指定的规则,基于channel_id为每一行选择合适的分区。channel_id值为2或4的行存储在even_channels分区中,而channel_id值为3或者9的行存储在odd_channels分区中,如下所示:
学习Oracle Concepts-第4章 分区、视图和其他模式对象_第2张图片

哈希分区
对于哈希分区,数据库基于对用户指定键应用数据库提供的哈希算法来映射行到分区。行的目的分区由应用于行的数据库内部哈希函数来决定。哈希算法被设计用来在设备间均匀的分配行,目的是每个分区有大约相同数量的行。
对于划分大表,提高管理能力,哈希分区是有用的。要管理的不是一张大表,而是几个较小的片。单个哈希分区的丢失不影响剩余的分区并且可以独立的恢复。
哈希分区对于高update争用的OLTP系统很有用。例如,一个段被分成了几部分,每个部分都可以被更新,代替了单个段的争用。
创建了一个分区键为prod_id的哈希分区hash_sales:

CREATE TABLE hash_sales
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, channel_id CHAR(1)
, promo_id NUMBER(6)
, quantity_sold NUMBER(3)
, amount_sold NUMBER(10,2)
)
PARTITION BY HASH (prod_id)
PARTITIONS 2;

当加载数据时,数据库试图随机均匀的将行分配给各个分区(分区名系统生成)。不能指定哪一行放在哪一个分区。数据库应用哈希函数,函数的结果决定了分区包含的行。如果改变了分区的数目,数据库会在所有分区上重新分配数据:
学习Oracle Concepts-第4章 分区、视图和其他模式对象_第3张图片

1.2 分区表

一个分区表由一个或多个分区组成,它们能够独立与其他分区的被操作和管理。表要么是分区表,要么是非分区表。即使一个分区表只有一个分区,他也和非分区表不同,不能将分区加入到未分区的表中。
分区表由一个或多个表分区段组成。如果创建了个一个叫hash_products的分区表,数据库不会为此表分配表段,数据库将数据存储在每个分区的分区段中。每个表分区段包含数据的一部分。
堆分区表中的所有分区都能被存储为压缩格式。使用压缩能节约空间和提高查询执行的速度。因此压缩对某些情况很有用,如插入。更新操作很少的数据仓库环境,也可用于OLTP环境。
能够为表空间,表或者表分区能够声明为具有表压缩属性。如果表压缩属性在表空间级别被定义,那么在该表空间中创建的表默认是被压缩的。可以修改表的压缩属性,但更改只应用于新插入的数据。因此,一个表或分区可能包含压缩块和非压缩块,保证数据的大小不会应为压缩而增大。如果压缩会增大块的大小,数据库就不会对块进行压缩。

1.3 分区索引

与分区表类似,分区索引被分成更小的、更抑郁管理的索引片。
全局索引独立于依赖的表创建分区;本地索引根据分区的方法自动链接到表分区。与分区表类似,分区索引提高了可管理能力,可用性、性能和可扩展性。
索引分类如图所示:
学习Oracle Concepts-第4章 分区、视图和其他模式对象_第4张图片

局部分区索引(本地分区索引)

在局部分区索引中,索引基于表上的分区键来创建分区,与表分区有相同的数目和边界。每个分区索引只与底层表的一个分区关联,所以一个索引分区中的所有键指向存储在单个表分区中的行。数据库会自动同步索引分区和与其相关的表分区,使每对 表-索引 保持独立。
局部索引的优点:
1.由于使索引无效或不可用的操作只影响本分区,因此提高了可用性;
2.简化了分区的维护。当移动一个表分区或分区中的数据失效时,只有相关的局部分区索引需要被重建或维护。如果是全局索引,则需要所有分区被重建或维护;
3.如果分区发生时间点恢复,局部索引能被恢复到恢复时间,而不需要重建索引。
局部分区索引创建:
CREATE INDEX hash_sales_idx ON hash_sales(time_id) LOCAL;
如下图:hash_sales表中有两个分区:SYS_P33、SYS_P34,因此,局部分区索引hash_sales_idx上也有两个分区:SYS_P38、SYS_P39;每个索引分区与不同的表分区建立联系:索引分区SYS_P38对表分区SYS_P33中的行建立分区;索引分区SYS_P39对表分区SYS_P34中的行建立分区;
学习Oracle Concepts-第4章 分区、视图和其他模式对象_第5张图片
不能显式的添加索引分区。只能添加表分区到基础表,新的索引分区被自动添加到索引。同样不能显式的删除索引分区。只能删除分区表中的表分区,相关的局部分区索引会自动被删除。
可以在分区上创建位图索引。分区上的位图索引必须是局部分区索引,不能是全局分区索引。全局位图索引只支持非分区表。
局部前缀索引和局部非前缀索引:
局部前缀索引:分区键处于索引定义的前导部分。
局部非前缀索引:分区键不是索引列列表的前导部分,甚至不包含在列表中。
这两种类型的索引都可以利用分区消除,优化程序不考虑无关分区,以加快访问速度。使用局部前缀索引的查询始终允许分区消除,而使用局部非前缀索引的查询可能不会。
局部分区索引存储:
与表分区类似,局部索引分区存储在自己的段中。每个段包含索引数据的一部分。因此由四个分区组成的局部索引不是存储在一个单一的索引段中,而是在四个单独的段中。

全局分区索引

全局分区索引是一个B-树索引,其分区独立于所依赖的基础表。一个分区索引可以指向任意的表分区,而在局部分区索引中,索引分区与分区表的表分区之间存在一对一的关系。
全局分区索引的创建:

CREATE INDEX time_channel_sales_idx ON
time_range_sales (channel_id)
	GLOBAL PARTITION BY RANGE (channel_id)
		(PARTITION p1 VALUES LESS THAN (3),
		PARTITION p2 VALUES LESS THAN (4),
		PARTITION p3 VALUES LESS THAN (MAXVALUE));

上面的全局分区索引包含指向多个表分区的条目。索引分区p1指向channel_id为2的行,索引分区p2指向channel_id为3的行,而索引分区p3指向channel_id为4或9的行。

全局分区索引主要应用于这种情况:表基于某个键分区(如employees.department_id列),但应用程序可能需要基于许多不同的键访问数据,这时全局索引很有用。
全局分区索引:
学习Oracle Concepts-第4章 分区、视图和其他模式对象_第6张图片

1.4 分区索引组织表

可以对索引组织表按范围、列表、或哈希值进行分区。分区有助于改进IOT额可管理性、可用性、和性能。另外,使用IOT的数据模块可以利用此功能,对其存储的数据进行分区。
特征:
1.分区列必须是主键列的子集;
2.可以对辅助索引进行局部或全局分区;
3.溢出数据段总是和表分区一样具有相应的对等分区;
Oracle数据库支持在分区和未分区的索引组织表上创建位图索引。在索引组织表上创建位图索引需要一个映射表。

2.视图概述

视图是一个或多个表的逻辑表示形式。视图本质上是一个存储的查询。视图的数据来源于它所依赖的被称为基表(base tables)的表。基表可以是表或其他视图。在视图上执行的操作实际上都影响基表。在大多数可以使用表的地方,也可以使用视图。
视图通常用于:
1.通过限制访问表的行或列,提供一个额外的安全级别;
2.隐藏数据的复杂性:视图的定义可以包含联接,是多个表中相关列或行的集合,视图隐藏了数据来源与多个表的事实。
3.从不同角度呈现基表的数据:重命名列;
4.基表定义的更改与应用孤立:基表4列,视图选用3列,基表增加第五列,对视图没有影响。
视图例子:

CREATE VIEW staff AS
SELECT employee_id, last_name, job_id, manager_id, department_id 
FROM employees;

图示:
学习Oracle Concepts-第4章 分区、视图和其他模式对象_第7张图片

2.1 视图特征

不像表,视图不分配存储空间,也不包含数据,而是通过定义一个查询,提取源自基表的数据。由于视图基于其他对象,除了需要在数据字典中定义视图的查询,并不需要存储数据。
视图依赖它引用的对象,被数据库自动处理。例如,如果你删除并重新 创建了视图的基表,数据库会自动确定新基表是否适用于视图的定义。

视图中的数据操作

由于视图是从表中派生出的,所以它们很相似。例如,一个视图最多能包含1000个列,就像表一样。用户能查询视图,并且在某些条件下可以对视图执行DML。对视图的操作影响视图基表的数据,且影响基表上的约束和触发器。
如下:在employees表上创建一个视图

CREATE VIEW staff_dept_10 AS
SELECT employee_id, last_name, job_id,
manager_id, department_id
FROM employees
WHERE department_id = 10
WITH CHECK OPTION CONSTRAINT staff_dept_10_cnst;

定义的查询只引用了departmet_id为10 的行。CHECK OPTION子句表示创建的视图是带有约束的,这个约束的目的是当执行的update和insert语句不符合视图的查询结果时,语句不会成功。也就是说department_id为10 的行能被插入,而为30的不能。

视图中的数据如何访问

数据库在数据字典中存储视图的定义,存的是定义视图的查询语句。当你引用视图时,数据库执行了下面的任务:
1.将 发出的查询语句 与 定义视图或其他基础视图的查询语句 尽可能的合并:数据库优化合并的查询,就像没有引用视图一样。因此,不论视图定义中是否引用了列,查询视图都可以使用基表列上的索引。
2.在shared SQL area 解析合并后的语句:只有当shared SQL area中不存在相似语句时,数据库才解析视图引用的语句,因此能减少与shared SQL area 相关的内存。
3.执行SQL语句。
视图数据访问示例: 假设创建了一个视图 employees_view

CREATE VIEW employees_view AS
SELECT employee_id, last_name, salary, location_id
FROM employees JOIN departments USING (department_id)
WHERE department_id = 10;

然后发出了一个查询视图的语句:

SELECT last_name
FROM employees_view
WHERE employee_id = 200;

数据库会结合视图定义和用户的语句,构造下面的查询语句:

SELECT last_name
FROM employees, departments
WHERE employees.department_id = departments.department_id
AND departments.department_id = 10
AND employees.employee_id = 200;

2.2 可更行联合视图

联合视图是指视图的from子句中有多个表或者视图。
示例: staff_dept_10_30 视图的定义是employees 和 departments相关联,只包括部门10 和 30 的雇员信息

CREATE VIEW staff_dept_10_30 AS
SELECT employee_id, last_name, job_id, e.department_id
FROM employees e, departments d
WHERE e.department_id IN (10, 30)
AND e.department_id = d.department_id;

可更新联合视图也叫可修改联合视图,它包含多个基表或或者视图,并且允许DML操作。一个可更新视图在select语句的顶级from子句中包含多个表,并且不被WITH READ ONLY子句限制。
为了使视图可更新,视图必须满足几个条件,例如通用规则是一个在联合视图上的INSERT、UPDATE或者DELETE操作只能同时修改一个基表。下面的数据字典USER_UPDATEBLE_COLUMNS显示了创建的可更新视图:

SELECT TABLE_NAME, COLUMN_NAME, UPDATABLE
FROM USER_UPDATABLE_COLUMNS
WHERE TABLE_NAME = 'STAFF_DEPT_10_30';
TABLE_NAME COLUMN_NAME UPDATABLE
STAFF_DEPT_10_30 EMPLOYEE_ID YES
STAFF_DEPT_10_30 LAST_NAME YES
STAFF_DEPT_10_30 JOB_ID YES
STAFF_DEPT_10_30 DEPARTMENT_ID YES

联合视图的可更新列必须映射键保留表的列。联合视图中的键保留表是一个表,其中的基表的每一行最多在查询的输出中出现一次。比如,department_id是departments的主键,所以employees表中的每一行在结果集中最多出现一次,使的employees是键保留的。departments的每一行在结果集中出现多次,所以他不是键保留的。

2.3 对象视图

视图是一个虚拟的表,那么 对象视图 就是一个虚拟对象表。视图中的每一行都是一个对象,也就是实例中的对象类型。一个对象类型是一个用户定义的数据类型。
可以查询,更新,插入和删除关系数据,如同它被存储为一个对象类型。还可以使用对象类型(如对象、REF、集合等)的列来定义视图。
和关系视图一样,对象视图也只显示你想要用户看到的数据。例如,一个对象视图能够显示关于IT程序员的数据,而忽略关于薪水的敏感数据;
如下:创建了一个叫employee_type的对象和基于这个对象的视图it_prog_view

CREATE TYPE employee_type AS OBJECT
(
	employee_id NUMBER(6),
	last_name VARCHAR2(35),
	job_id VARCHAR2(20)
);

CREATE VIEW it_prog_view OF employee_type
	WITH OBJECT IDENTIFIER (employee_id) AS
SELECT e.employee_id,e.last_name,e.job_id
FROM employees e
WHERE job_id='IT_PROG';
3.物化视图概述

物化视图是被存储为模式对象的查询结果。查询的from子句可以是命名表、视图或这物化视图。这些对象被称为主表或者明细表。
物化视图常常被用来汇总、计算、复制和分发数据。使用于以下环境:
1.在数据仓库中,可以使用物化视图来计算和存储由聚集函数(求和或者求平均值))生成的数据;
2.在物化视图复制中,该视图包含从一个时间点以来的一张表的完整或部分拷贝。物化视图在分布式的站点上复制数据,并且在多个站点上同步更新。
3.在移动计算环境中,可以通过物化视图将数据子集从中央服务器定期下载到移动客户端,并定期将客户端更新的数据返回服务器。
物化视图:
学习Oracle Concepts-第4章 分区、视图和其他模式对象_第8张图片

3.1 物化视图的特征

物化视图与某些非物化视图和索引共享某些特性。物化视图与索引在以下几点上类似:
1.包含实际的数据且消耗存储空间;
2.当主表数据被更改时,能被刷新;
3.当被用于查询重写时,能够提高查询的性能;
4.对SQL程序和用户来说是透明的;
物化视图与非物化视图类似,都是展现其他表或者视图的数据。不像索引,用户可以直接用select 语句查询物化视图。物化视图也能被DML语句更新,这取决于刷新类型。
创建物化视图的示例:

CREATE MATERIALIZED VIEW sales_mv AS
SELECT t.calendar_year, p.prod_id, SUM(s.amount_sold) AS sum_sales
FROM times t, products p, sales s
WHERE t.time_id = s.time_id
AND p.prod_id = s.prod_id
GROUP BY t.calendar_year, p.prod_id;

当物化视图基于的主表被删除时,物化视图仍然可以查到数据。物化视图可以被分区。可以基于分区表创建物化视图并创建索引。

3.1 物化视图的刷新方法

主表的数据更改后,数据库通过刷新的方式来维护数据。刷新方法可以是增量刷新(也叫快速刷新)和完全刷新。
当物化视图被定义为BUILD IMMEDIATE时,会发生完全刷新,除非引用了预建表。刷新会执行物化视图定义时的查询,这个过程可能很慢,尤其是在数据库读取和处理大量数据时。
快速刷新消除了重新生成物化视图的需要,由于快速刷新仅处理更改,刷新速度可能会非常块。可以根据需要或者定期刷新物化视图。另外,当物化视图与其主表在同一个数据库,并且主表上的更改事务被提交时,物化视图能被刷新。
对于使用快速刷新的物化视图,由materialized view log 或者direct loader log记录主表的更改。一个物化视图日志是记录主表更改数据的模式对象,目的是定义在主表上的物化视图能够增量刷新。一个物化视图日志只关联一个主表,且与主表处于相同的数据库和模式下。

3.3 查询重写

查询重写是一种优化技术,他将一个用户根据主表编写的请求转换为一个包含物化视图语义的等效请求。
查询重写: 数据库为原始查询和查询重写生成执行计划,并比较成本,选择成本低的
学习Oracle Concepts-第4章 分区、视图和其他模式对象_第9张图片

4.序列概述

序列是一种模式对象,多个用户可以从中生成唯一的整数。序列生成器提供了一种高度伸缩且性能良好的方法来为数字类型的数据生成代理键。

4.1 序列的特征

一个序列的定义指明了一些如下常用信息:
1.序列的名字;
2.序列是升序还是降序;
3.数字间的间隔;
4.数据库是否在内存中缓存一些序列生成的数;
5.当到达限制时,序列是否能够循环。
创建序列的示例:

CREATE SEQUENCE customers_seq
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;

第一个引用 customers_seq.nextval 返回100.第二个返回1001.每个后续引用返回的值都比前一个引用返回的值大1。

4.2 对序列的并发访问

同一个序列能为多个表生成唯一编号,不会产生磁盘IO开销或者事务锁。例如,两个用户同时向orders表中插入新行,通过使用序列来为order_id列生成唯一编号,任何一个用户都不必等待其他人输入下一个可用的订单号。序列自动为每个用户生成正确的值。
每个引用序列的用户都有权访问在该会话中生成的最后一个序列值。用户可以发出一个语句生成一个新的序列号,或者使用该会话最后生成的当前序列号。
在某个会话中的一个语句生成一个序列号后,只有该会话可以使用它。单个序列号可以被跳过。如果某些序列号在事务中被生成使用,但是事务被最终回滚,则它们被跳过,导致序列变得不连续。

5.维度概述

一个典型的数据仓库有两个重要的组成部分:维度和事实。维度是用于指定业务问题中的分类,例如时间、地理位置、产品、部门和分发渠道。事实是与一些维度值关联的事件或这实体,例如,销售或利润。
多维度请求的示例一般为以下几种:
1.显示2007年和2008年,从州到国家到地区在的地理维度聚合级别上不断增长的所有产品的销售额;
2.创建一个显示2010年和2011年南美地区运营费用跨表格分析。包括所有可能的小计;
3.根据2011年汽车产品销售收入,列出亚洲地区前10名销售代表,并对他们的佣金进行排名。

5.1 维度的层次结构

维度表是定义列对或列集之间的层次关系的逻辑结构。维度没有分配数据存储。维度信息存储在维度表中,而事实信息存储在事实表中。
在客户维度中,客户可以向上滚动到城市、州、国家、子区域和区域。数据分析通常从维度层次结构的较高级别开始,如果情况需要进行这样的分析,则逐步深入。
子级的每个值都与父级的一个值且仅有一个值关联。层次关系是从层次结构的一个层次到层次结构中的下一个层次的函数依赖。

5.2 创建维度

维度通过sql语句创建。CREATE DIMENSION语句指明了以下几点:
1.多个LEVEL子句,每个标识一个列或者列集;
2.一个或多个HIERARCHY子句,指定相邻级别的父子关系;
3.可选的ATTRIBUTE子句,标识和一个级别相关的额外的列或列集。
**创建维度:**创建了一个customers_dim维度

CREATE DIMENSION customers_dim
LEVEL customer IS (customers.cust_id)
LEVEL city IS (customers.cust_city)
LEVEL state IS (customers.cust_state_province)
LEVEL country IS (countries.country_id)
LEVEL subregion IS (countries.country_subregion)
LEVEL region IS (countries.country_region)
HIERARCHY geog_rollup (
customer CHILD OF
city CHILD OF
state CHILD OF
country CHILD OF
subregion CHILD OF
region
JOIN KEY (customers.country_id) REFERENCES country )
ATTRIBUTE customer DETERMINES
(cust_first_name, cust_last_name, cust_gender,
cust_marital_status, cust_year_of_birth,
cust_income_level, cust_credit_limit)
ATTRIBUTE country DETERMINES (countries.country_name);

维度中的列可以来自同一个表(非规范化),也可以来自多个表(完全规范化或部分规范化)。例如,规范化的时间维度可以包括一个日期表、一个月表和一个年表,其中包含连接每个日期行和一个月行、每个月行和一个年行的连接条件。在完全非规范化的时间维度中,日期、月份和年份列位于同一个表中。无论是规范化的还是非规范化的,列之间的层次关系都必须在CREATE DIMENSION语句中指定。

6.同义词概述

一个同义词是一个模式对象的别名。例如,你能为一个表、视图、序列、PL/SQL 程序单元、用户定义的对象类型或另一个同义词等创建同义词。由于同义词只是一个别名,因此只需要在数据字典中存储定义,不需要数据存储。
同义词可以为数据库用户简化sql语句,也可以用于隐藏底层模式对象的标志和位置。如果必须重名名或移动底层对象,仅需要重新定义同义词而基于同义词的应用程序无需修改可以继续工作。
能创建私有同义词和公有同义词。私有同义词位于特定用户的模式中,该用户可以控制其对其他用户的可用性。公有同义词被名为public的用户组拥有,每个数据库用户都可以访问它。
公有同义词:

SQL> CREATE PUBLIC SYNONYM people FOR hr.employees;
Synonym created.
SQL> CONNECT oe
Enter password: password
Connected.
SQL> SELECT COUNT(*) FROM people;
COUNT(*)
----------
107

管理员创建了一个名为people的公有同义词,指向了hr下的employees表;登录oe用户,查询people返回了引用的表中的行数。
公有同义词很少使用,因为它们使数据库难以整合。另一个管理员也试图创建一个名为people的公有同义词时会失败,应为一个数据库中,只能由一个名为people的公有同义词存在。过度使用公有同义词会导致应用间的命名空间冲突。
同义词本身是不安全的。当您对同义词授予对象权限时,实际上是在授予底层对象的权限。同义词仅作为GRANT语句中对象的别名。

你可能感兴趣的:(学习,Oracle,concepts,Oracle,模式对象)