模式对象简介

来源:互联网 发布:关于人工智能的作文 编辑:程序博客网 时间:2024/04/28 20:08

数据库模式,是被称为模式对象的数据结构的逻辑容器。

数据库用户具有口令并拥有各种数据库的权限。每个用户拥有一个单一的模式,此模式与用户具有相同的名称。模式包含相应用户的全部数据。 在生产数据库中,一个数据库模式的拥有者通常表示一个数据库应用程序,而不是一个人。

在一个模式里,某一特定类型的每个模式对象都有一个唯一的名称。同时在一个模式里,不同类型的模式对象也可能需要唯一的名称。

模式对象类型

在关系数据库中,最重要的模式对象是表。 表以行的形式存储数据。

Oracle SQL 使您能够创建和操作许多其他类型的模式对象,包括以下这些:

索引

索引是一种模式对象,对于每一个被索引的表行或表簇行,索引都包含一个条目 ,以提供直接、 快速的存取。 Oracle 数据库支持几种类型的索引。 一个索引组织表是一个表,其数据以一个索引结构来存储。

分区

分区是大型表和索引的分片。 每个分区有其自己的名称,并可能有其自己(可选)的存储特征。

视图

视图是对一个或多个表、或其他视图中的数据的自定义表示。 你可以把它们看作存储的查询。 视图实际上并不存储数据。

序列

序列是一个由用户创建的对象,可以被多个用户共享,用于生成整数。 通常,序列用于生成主键值。

维度

维度定义多个列集之间的父-子关系,列集中的所有列必须都来自同一个表。维度通常用于对客户、 产品、和时间之类的数据进行分类。

同义词

同义词是另一个模式对象的别名。 因为同义词只是一个别名,它在数据字典中除了其定义之外,没有存储。
注:同义词本身也是可以作为模式对象授权给其他用户。
v$开头的动态性能视图是以
v_$开头的动态性能视图的同义词。
这种类型的同义词如果作为模式对象授权给其他用户的话,会提示如下信息:
ORA-02030: can only select from fixed tables/views

PL/SQL子程序和包

PL/SQL 是Oracle 对SQL的过程化扩展。 PL/SQL 子程序是命名的 PL/SQL 块,可以带参数调用。 PL/SQL 包用于将逻辑上相关的 PL/SQL 类型、 变量、游标、和子程序进行分组。

注:模式对象的信息可以通过相应的数据字典视图查看。

还有一些其他类型的对象也存储在数据库中,并以SQL语句来创建和操作,但不包含在模式中。 这些对象包括数据库用户、 角色、 上下文、和目录对象

模式对象存储

一些模式对象将数据存储在称为段的逻辑存储结构中。其他模式对象,则只包含元数据。

Oracle 数据库逻辑上将模式对象存储在表空间中。 在模式和表空间之间没有任何的关系: 一个表空间可以包含来自不同的模式的对象,一个模式中的对象也可以包含在不同的表空间中。 每个对象的数据在物理上包含在一个或多个数据文件中。

一个表的数据段跨越两个数据文件,这两个数据文件属于同一个表空间。 一个段不能跨多个表空间。

模式对象依赖

一些模式对象会引用其它对象,这就产生了模式对象依赖。如果对象 A 的定义引用了对象 B,那么 A 相对于B来说是依赖对象,或B相对于A来说是被引用对象。

Oracle 数据库提供了一种自动的机制,以确保依赖对象对于相应的被引用对象来说始终是最新的。 当依赖对象产生后,数据库将跟踪依赖对象和其被引用对象之间的依赖关系。当被引用对象的更改可能会影响依赖对象时,依赖对象被标记为无效

在一个无效的依赖对象重新变得可用之前,必须基于对被引用对象的新定义重新编译。 当无效依赖对象被引用时,重新编译会自动发生。

为演示模式对象之间如何产生依赖,下面的示例脚本创建表 test_table,然后创建一个查询此表的存储过程:

CREATE TABLE test_table ( col1 INTEGER, col2 INTEGER );CREATE OR REPLACE PROCEDURE test_procASBEGINFOR x IN ( SELECT col1, col2 FROM test_table )LOOP-- process dataNULL;END LOOP;END;/

下面的查询显示过程 test_proc 的状态是有效的:

select object_name, status from user_objects where object_name=upper('test_proc');

向test_table表中添加 col3 列之后,该过程仍然是有效的,因为该过程不依赖于该列:

alter table test_table add col3 number;

但是,更改col1 列的数据类型后,test_proc过程变得无效,因为该过程依赖于该列。

alter table test_table modify col1 varchar2(20);

运行或重新编译该过程使它重新有效,如下面的示例中所示:

SQL> execute test_procPL/SQL procedure successfully completed.

注:在对被引用对象的修改,可能导致依赖对象重新编译之后仍然不可用。

0 0
原创粉丝点击