Oracle的Schema管理
8.1 目标
通过本节,您应该能够:
- 建立和修改数据库表
- 查看数据库信息
- 建立额外的数据库对象
- 将数据导入表中
8.2 什么是Schema?
方案(Schema)是数据库对象的集合。一个Schema由一位数据库使用者所拥有,并且名称与该用户相同。Schema对象是直接参照数据库数据的逻辑结构,而其所包含的结构有表、视图及索引等。
注意: 表空间与Schema之间并无关系。同一Schema中的对象,可以位于不同的表空间,而一个表空间可以保存来自不同Schema的对象。
您可以使用SQL或Oracle Enterprise Manager(EM)来建立和操作Schema对象。当您使用Enterprise Manager时,EM会为您产生基础SQL。
8.3 Schema
在数据库建立过程中,会建立下列Schema:
- SYS
- SYSTEM
- 范例Schema
当您建立数据库时,也会为您建立一些Schema。下列是两个特别重要的Schema:
SYS Schema: 所有组成数据库数据字典(Data dictionary)的基础表与视图,都建立于SYS Schema中。数据字典是描述Oracle数据库的一种表集合。数据字典是在建立数据库时,于SYSTEM表空间中建立的,而且会在执行数据定义语言(DDL)时,由Oracle数据库服务器来更新。数据字典中包含关于用户、Schema对象以及存储结构的信息。
您可以将数据字典当成数据库相关信息的只读参考来使用。当您使用Enterprise Manager时,可以透过是图表来存取数据字典表。
任何用户或数据库管理员都不应该修改SYS Schema中的对象,而且没有人需要在用户SYS的Schema中建立任何表格。
SYSTEM Schema:包含存储管理信息的额外表与视图表,以及各种Oracle选项及工具所使用的内部表格及视图表。您不应在SYSTEM Schema中建立任何额外的对象。
在Oracle数据库完整的安装程序期间,【范例Schema】会随内建数据库一起自动安装。【范例Schema】的用途在于可为Oracle文件与课程中范例,提供一个共通平台。它们是一组有关联的Schema,主要是提供分层的结构来简化复杂性,其包含下列项目:
HR: 【人力资源(Human Resource)】Schema是一种介绍几本主题的简单Schema。这个Schema的扩充数据支持Oracle Internet Directory的示范。
OE: 【订单录入(Order Entry)】Schema用于处理中度复杂性的事务。在OE Schema中有许多数据类型。而OC(线上目录)子Schema则是对象关联式的数据库对象集合,内建于OE Schema中。
PM: 【产品媒体(Product Media)】Schema专门用于多媒体数据类型。
QS: 【等待运送(Queued Shipping)】Schema包含一组用来示范Oracle Advanced Queuing功能的Schema。
SH: 【销售历史记录(Sales History)】Schema是设计用来示范更大量的数据。此Schema的扩充数据提供了对高级分析处理的支持。
8.4 查看Shema
您可以从数据库页面的【方案(Schema)】页签,快速访问多种类型的Schema对象。
按一下其中一个对象链接之后,会显示对应页面。在此页面的【搜寻(Search)】区,您可以输入方案名称与对象名称来搜寻特定的对象。
8.5 定义表中的数据类型
建立表时,您必须替表的每个数据列指定数据类型。而在建立程序或预定义函数时,您必须为每个参数指定数据类型。
这些数据类型会定义每个数据列可包含的数值范围。
Oracle数据库内建的数据类型包括:
- CHAR: 固定长度的字符数据(长度大小的位数固定)。最大值为2000个字符。默认为最小值及1个字符长度。
- DATE: 有效的日期范围在西元前4712年1月1日到西元9999年12月31日之间。DATE数据类型可存储日期与时间信息。
- NUMBER: 拥有精确度p及小数位数s的数字。精确度是指总共的位数。小数位数则是小数点右边的位数。
- VARCHAR2: 变长的字符串,拥有最大长度的位数或字符。最大值为4000个字符,最小值则是1个字符。您必须指定VARCHAR2的大小。
如需有关内建数据类型与用户定义类型的完整清单,请参阅Oracle Database SQL Reference。
8.6 建立和修改表
表是Oracle数据库的数据存储基本单位。表中保存可供用户存取的所有数据。每个表都有数据列及数据行。
新建表
您可以使用Enterprise Manager, 按下面的步骤来建表:
- 在数据库页面【方案(Schema)】页签的【数据库对象(Database Objects)】区按一下【表(Tables)】。会出现【表(Table)】页面。
- 如果您知道Schema名称,那么请在【搜寻(Search)】区域的方案栏位中输入Schema的全名或部分名称,请按一下方案栏位旁的手电筒图示。会出现【搜寻和选择: 方案(Search and Select: Schema)】视窗。您可透过选择页面来浏览Schema, 在选择正确的Schema。
- 按一下【建立(Create)】。会出现【建表:表组织(Create Table: Table Organization)】页面。
- 按一下【继续(Continue)】,选择【标准,堆组织(Standard, Heap Organized)】。
- 接着会出现【建表(Create Table)】页面。
- 在【名称(Name)】栏位中输入表名称。
- 在【Schema】栏位中输入名称,或按一下手电筒图示来呼叫搜寻功能。
- 在【表空间(Tablespace)】栏位中输入表空间名称,或是按一下手电筒图示来呼叫搜寻功能。
- 在【数据列(Columns)】区中输入名称与数据类型。
- 按一下【确定(OK)】。会出现更新信息,表示表已建立成功。
修改表
您可以使用Enterprise Manager来修改表,步骤如下。在这个范例中,会在表中新增数据列。
- 在【表(Tables)】页面的结果清单中选择表,再按一下【编辑(Edit)】。
- 在【编辑表(Edit Table)】页面中按一下【新增5个表数据列(Add 5 Table Columns)】按钮。会出现可编辑的数据列清单。
- 输入新数据列的名称、数据类型以及大小。再按一下【应用(Apply)】。
- 会出现一个更新信息,表示表格已经修改成功。
8.7 了解数据完整性
【实体关系(Entity Relationship)】图说明了HR范例中定义的数据完整性约束条件。
您可以使用下列完整性约束条件对录入的数据列值加上限制:
不是NULL(NOT NULL): 预设情况下,表中的所有数据列均允许空值。空值表示没有数值。【NOT NULL】限制条件需要表的数据列包含非空值。例如,您可以定义一个【NOT NULL】限制条件来要求在EMPLOYEES表中,每个数据列的LAST_NAME数据列,都必须填入一个值。
唯一键(UNIQUE Key): 【唯一键】完整性约束条件需要一个数据列或一组数据列(索引键)中的每个值都必须是唯一的,也就是说,在一个特定数据列或一组特定数据列中,表的两个数据列不能有重复的值。例如,DEPARTMENTS表的DEPARTMENT_NAME数据列中所定义的【唯一键】约束条件就不允许数据列中有重复的部门名称。
主索引键(PRIMARY Key: 主键): 数据库中的每个表都有至少一个【主索引键】约束条件。在一个或多个数据列组中受限于这个约束条件的值,就构成了数据列的唯一ID。实际上,每个数据列都是由其主索键值来命名。
主索引键完整性约束条件的Oracle实行,能确保下列两项均为真:
– 不会有一个表的两个数据行在特定数据列或一组数据数据列中有重复的值。
– 主索引键数据列不允许空值。也就是说,每个数据列中的主索引键数据列里,必须要有一个值。
外来索引键(Foreign Key: 外键)约束(也称为【引用完整性约束(Referential integrity constraint)】): 在关系数据库的不同表,可以通过共同的数据列来建立关联,而且必须维护负责管理数据列关系的原则。引用完整性原则可以确保适当地保存这些关系。
引用完整性约束条件需要在表中每个数据列的外来索引键都符合一个父键(Parent key)中的值。
例如,在EMPLOYEES表中DEPARTMENT_ID数据列所定义的外来索引键。此外键确保数据列中的每个值都符合DEPARTMENTS表(DEPARTMENT_ID数据列也是)主索引键中的值。所以,在EMPLOYEES表中的DEPARTMENT_ID数据列不会存在错误的部门号码。
另一种类型的引用完整性约束条件被称为【自引用完整性约束(Self-referential integrity constraint)】。这种类型的外来索引键会参考相同表中的父键。
CHECK约束:一个数据列或一组数据列上的CHECK 完整性约束,需要表上的每个数据列,有一个特定条件为真或位置。如果DML语句结果经CHECK约束判定为假,那么语句就会被倒回。例如,您可以在EMPLOYEES表中,建立一个CHECK约束,以确保salary*commission_pct <= 5000。
8.8 定义约束
您可以在表中加入约束条件,步骤如下:
- 在【表(Tables)】页面选择表格,再按一下【编辑(Edit)】。
- 按一下【约束条件(Constraints)】。画面上会显示【约束条件 (Constraints)】页面,其中显示表中所有已定义的约束。
- 从约束条件下拉列表中选择要加入的约束条件类型,再按一下【添加(Add)】。
- 为您正在定义的约束条件类型输入适当的信息。再按一下【继续(Continue)】,回到表页面后,点【应用(Apply)】。
8.9 查询表的属性
您可以使用Enterprise Manager来查看表格属性,步骤如下:
- 在数据库页面【方案(Schema)】页签的【数据库对象(Database Objects)】区中按一下【表(Tables)】链接。
- 从【搜索(Search)】结果清单中选择一个表,再按一下【查看(View)】按钮来查看表的属性。
8.10 查询表的内容
您可以使用Enterprise Manager来查看表中的数据列,步骤如下:
- 选择【表(Tables)】页面中的表。从【操作(Actions)】功能表中选择【查看数据(View Data)】, 再按一下【开始(Go)】。
- 接下来会出现【查看表的数据(View Data For Table)】页面。表中的列数据会显示在【结果(Results)】区域中。【查询(Query)】框中会显示经执行产生此次结果的SQL查询语句。
在这个页面中,您可以按一下任意数据列名,在数据列中以升序或降序来排列数据。如果您想要变更查询。请按一下【细化查询(Refine Query)】按钮。您可以在【细化对表的查询(Refine Query for Table)】页面选择要显示的数据列,以及指定SQL语句的WHERE子句来限制结果。
如需更多SQL语句中WHERE子句的详细相关信息,请查阅Oracle Database SQL Reference。
8.11 删除表
如果您不再需要数据库中的一张表,您可以删除该表。删除表时,会发生下列情况:
- 从数据字典中移除表定义
- 移除表的所有数据列
- 移除表上所有已定义的索引
您可以用Enterprise Manager来删除表,步骤如下:
- 从数据库页面【方案(Schema)】页签的【数据库对象(Database Objects)】区选择【表(Tables)】。
- 输入Schema名称与表名,或者使用搜寻功能来选择表。在选择【使用选项删除(Delete With Options)】,进入相关页面。
- 在【使用选项删除(Delete With Options)】页面中使用默认选项。如果您确实需要删除此表,请按一下【是(Yes)】。
- 如果已经成功删除表,会出现一个确认。
如果您之后发现误删了一个表,您可以使用【回收站】功能加以还原。
8.12 管理索引
- 让您可以更快速存取表中的数据列
- 会自动用于数据存取
- 在实体上是独立于表之外
- 在更新表时会自动维护
索引是与表相关的选择性结构。您可以建立索引以提升数据查询的性能。Oracle索引提供了表数据的直接存取路径。
索引可被建立在表的一个或更多数据列上。在建立索引之后,此索引会自动由Oracle服务器来维护和使用。当更新表时,对相关索引所做的变更,会在用户可完全掌握的情况下自动建立。
您可以在数据库页面【方案(Schema)】页签【数据库对象(Database Objects)】区按一下【索引(Indexes)】链接,来查看【索引(Indexes)】页面。您可以查看索引属性,或使用【操作(Actions)】功能表来查看索引的相关性。
您可以明确建立索引,也可使用隐式建立方式,通过建立表约束来建立索引。
8.13 创建和删除索引
您可以按照下列步骤,在一个数据列上建立标准(B-tree)索引:
- 在数据库页面【方案(Schema)】页签的【数据库对象(Database Objects)】区中按一下【表(Tables)】链接,进入【表(Tables)】页面。
- 输入表名或使用搜寻功能来选择表。请从【操作(Actions)】下拉功能表中选择【创建索引(Create Index)】。再按一下【开始(Go)】。
- 接下来会出现【创建索引(Create Index)】页面。请为新的索引输入名称。然后输入表空间名称,再选择【标准 B-树 (Standard B-tree)】作为索引类型。
- 在【顺序(Order)】数据列中输入1, 以从表列清单中选择数据列。然后为【排序顺序(Sorting Order)】选择ASC。按一下【确定】。
- 在建立索引之后,会出现【索引(Indexes)】页面和一个确认信息。新的索引会列于【结果(Results)】下方。
请执行下列步骤来删除索引:
- 在数据库页面【方案(Schema)】页签的【数据库对象(Database Objects)】区中选择【索引(Indexes)】。会出现【索引(Indexes)】页面。
- 输入索引名称或使用搜寻功能来找出索引。按一下【删除(Delete)】。
- 如果确定此索引无误,那么请在【确认(Confirmation)】页面按一下【是(Yes)】。
- 如果已经成功删除索引,会出现一个确认信息。
8.14 管理视图
- 视图是表中数据的自定义呈现方式。
- 视图不包含数据。
视图是一个或多个表、或是其他视图中数据的自定义呈现方式。您可以将视图视为已储存的查询。视图实际上并不包含数据,而是从它作为基础的表衍生出数据。这些表即称为视图的基础表。
视图和表类似,可以有限制地加以查询、更新、插入数据以及删除。在视图上执行的所有操作,实际上会影响视图的基础表。视图藉由限制存取一个表中预先决定的一组数据列与数据行,来提供额外层次的安全性。视图也会隐藏数据复杂性和存储复杂的查询。
您可以在数据库页面【方案(Schema)】页签的【数据库对象(Database Objects)】区按一下【视图(Views)】链接,来查看数据库中定义的视图。您也可以使用Enterprise Manager来建立视图。
8.15 管理数据库中的常驻程序单元
使用Enterprise Manager来管理下列数据库常驻程序单元:
- 包(Package)
- 包体(Package body)
- 独立子程序(Stand-alone subprogram)
– 过程(Procedure)
– 函数(Function)
- 数据库触发器(Database trigger)
【数据库常驻程序单元(Database resident program unit)】是以PL/SQL或Java语言所撰写,并储存在Oracle数据库中的程序。通过使用数据库常驻单元,您就可以编写一般使用的程序,然后从任何应用程序中呼叫它。如此可以确保企业原则具有一致的应用程序,还能让应用程序的开发变得简单。
您可以使用Enterprise Manager来管理像PL/SQL包、过程、触发器以及函数等原始文件类型,Enterprise Manager也能管理Java源代码及class文件。可执行的动作包括建立、编译、建立同义词、授权以及显示这些源文件的相关性。
下列是可建立的数据库常驻单元类型:
- 包(Package): 这是个在单一单元中包含定义、PL/SQL程序码或两者都包含的结构。
- 包体(Package body): 包含包定义中所定义的过程及函数所用的PL/SQL程序码。
- 独立子程序(Stand-alone subprogram): 过程与函数都是独立子程序。函数必须传回一个值给呼叫的过程。
- 数据库出发器(Database trigger): 这些是与数据库表、视图或事件相关的预存子程序。
8.16 使用Enterprise Manager来管理资料库常驻程序单元
您可以按一下【管理(Administration)】特性页中的【包(Packages)】链接,来开启【包(Packages)】特性页面,然后查看已经存在于数据库的程序包。接下来您可以使用Schema名称、Schema与对象名或两者都不用,来搜寻程序包。(最后一个选项会在结果集中包含所有包。)如果要查看包的定义,请在【结果(Results)】清单中按一下它的名称,或是在【结果(Results)】清单中选择该程序包,按一下【编辑(Edit)】。【编辑程序包(Edit Package)】特性页面包含包名、Schema、状态以及来源。从【编辑程序包(Edit Package)】特性页面,您可以修改包、包体定义以及编译程序包。在【包(Package)】特性页面按一下【建立(Create)】就可以建立新的包。您也可以从这个页面删除包。
您可以使用Enterprise Manager以相同方式来管理其他类型的数据库常驻程序单元。
如需更多关于建立管理数据库常驻程序单元的信息,请参阅Oracle Database Application Developer’s Guide – Fundamentals。
8.17 管理Schema对象的访问
在预设情况下,只有对象的拥有者或是有高级系统权限的用户才能够访问此对象。而对于每个您想要提供给其他用户访问的对象,您必须先授权给那个对象。您可以直接授权给用户或角色。
8.18 加载数据
您可以使用Enterprise Manager以批处理方式将数据导入表中,此批量导入功能在您拥有大量数据时相当有用。您可以从操作系统文件或从其他数据库导入数据。您也可以将数据导出为文件。
如果要使用Enterprise Manager来导入数据,其中一个方法是使用控制文件(.ctl)与数据文件(.dat)。这些文件会被格式化为标准SQL*Loader文件。
注意:请不要将SQL*Loader控制文件和您的数据库控制文件混淆。SQL*Loader控制文件是用来描述批量导入中所使用的数据文件。
您可以按照下列步骤来导入数据:
- 以有管理权限的SYS或其他用户来登入Enterprise Manager。
- 在数据库首页【数据移动(Data Movement)】页签的【移动行数据(Move Row Data)】下方按一下【从用户文件加载数据(Load Data from User File)】,以呼叫导入精灵。
- 在【加载数据: 生成或使用现有控制文件(Load Data: Generate Or Use Existing Control File)】选择【使用现有控制文件(Use Existing Control File)】,输入主机登陆用户名与密码。点【继续(Continue)】。
- 在【加载数据:控制文件(Load Data: Control File)】页面,输入您在数据库服务器上的控制文件完整路径。此外,还必须输入主机登陆用户名与密码。按一下【下一步(Next)】。
- 在【加载数据:数据文件(Load Data: Data File)】画面,选择【提供数据库服务器的完整路径和名称(Provide the full path and name on the database server machine)】,再输入路径。按一下【下一步(Next)】。
- 在【加载数据:导入方法(Load Data: Load Method)】画面选择预设的【传统路径(Conventional Path)】作为导入方法。
- 在【导入数据: 选项(Load Data: Options)】画面【可选文件(Optional Files)】下选择【产生日志文件(Generate Log file)】来储存记录信息。您可以选择预设的文件名称与路径,或是输入不同的文件名称与路径。请注意画面中能让您选择限制导入的数据行数目。按一下【下一步(Next)】。
- 在【加载数据: 调度(Load Data: Schedule)】画面中,请输入【作业名称(Job Name)】与【说明(Description)】。选择【立即(Immediately)】以立即执行工作。按一下【下一步(Next)】。
- 您可以使用【加载数据: 复查(Load data: Review)】画面来查看您的文件名与导入方法。如果您想要变更任何项目,请按【上一步(Back)】。否则就按【提交作业(Submit Job)】开始导入数据。
- 接下来会出现【状态(Status)】画面和【导入数据提交成功(Load Data Submit Successful)】信息。按一下【查看工作(View Job)】来查看工作摘要。摘要画面会指示已成功完成的工作。您可以按一下【日志(Logs)】标题下等的您的作业或是直接查看日志文件,来查看日志文件。
- 您可以藉由浏览【表(Tables)】页面来确认已导入的数据。请先选择表,再选择【查看数据(View Data)】。
8.19 总结
在本节中,您应该已了解如何:
- 建立和修改表格
- 定义约束条件
- 查看表的属性
- 查看表的内容
- 建立索引及视图
- 将数据导入表中
Leave a Reply