管理数据库对象Word下载.docx
- 文档编号:16620493
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:39
- 大小:851.33KB
管理数据库对象Word下载.docx
《管理数据库对象Word下载.docx》由会员分享,可在线阅读,更多相关《管理数据库对象Word下载.docx(39页珍藏版)》请在冰豆网上搜索。
事实上,这条SQL语句的完整写法应为:
select*fromscott.emp,因为在数据库中一个对象的完整名称为“方案名.对象名”,而不是“用户名.对象名”。
解释
3.1.2同义词概述
同义词并不占用实际存储空间,只在数据库字典中保存同义词的定义。
可以创建同义词的对象主要包括表、视图、同义词、序列、存储过程等对象。
在开发数据库应用程序时,应当普遍遵守的规则是:
尽量避免直接引用表、视图或其他对象的名称。
否则,当DBA改变了这些对象的名称时,就必须重新更改并编译应用程序。
因此,DBA应当为开发人员建立对象的同义词,这样即使基础表或其他对象发生了变动,也只需要在数据库中对同义词进行修改,而不必对应用程序作出任何改动。
Oracle中可以创建两种类型的同义词:
公用同义词和方案同义词。
3.1.3公用同义词与方案同义词
1.公用同义词(publicsynonym)
公用同义词由一个特殊的用户组PUBLIC所拥有,数据库中所有的用户都可以使用公用同义词。
SYS用户创建的数据字典视图就是公用同义词的示例。
2.方案同义词(schemasynonym)
方案同义词由创建它的用户所拥用,也称为私有同义词(privatesynonym),用户可以控制其他用户是否有权使用属于自己的方案同义词。
方案同义词常在应用开发中使用,为应用开发提供命名上的解决方案。
值得注意的是,当代码引用一个未限定的表、视图、同义词、序列、函数等对象时,Oracle会按以下顺序来查看这3个位置是否有被引用的对象:
(1)当前用户拥有的对象。
(2)由当前用户拥有的一个方案同义词。
(3)公用同义词。
可见,方案同义词的搜索顺序优于公用同义词。
如果在这3个地方都没有找到该对象的名称,将会出现错误提示,如“ORA-00942:
表或视图不存在”。
3.1.4创建同义词
1.创建方案同义词
需要在自己的方案中创建方案同义词时,用户必须具有CREATESYNONYM系统权限;
需要在其他的方案中创建方案同义词时,用户必须具有CREATEANYSYNONYM系统权限。
语法:
CREATE[ORREPLACE]SYNONYMsynonym_name[schema.]object;
其中,ORREPLACE表示如果同义词已经存在,将重新覆盖新建同义词。
如图1.3.1所示,在被授予CREATESYNONYM系统权限后,SCOTT用户在其dept表上创建方案同义词syn_dept。
图1.3.1创建方案同义词
2.创建公用同义词
需要创建公用同义词时,用户必须具有CREATEPUBLICSYNONYM系统权限。
CREATE[ORREPLACE]PUBLICSYNONYMsynonym_name[schema.]object;
如图1.3.2所示,在被授予CREATESYNONYM系统权限后,SCOTT用户在其dept表上创建公用同义词pubsyn_dept。
图1.3.2创建公用同义词
注意
3.1.5使用同义词
1.使用方案同义词
使用方案同义词可分为方案用户使用和其他用户使用。
(1)方案用户使用自己的方案同义词。
方案用户具有对象的所有权限,所以可以像使用原对象一样使用该对象的同义词。
SCOTT用户使用自己方案中syn_dept方案同义词的示例如图1.3.3所示。
图1.3.3方案用户使用自己的方案同义词
(2)其他用户使用另一个用户创建的方案同义词。
由于方案同义词是私有的,所以其他用户无法直接使用另一个用户所创建的方案同义词,但能够以在方案同义词前面加上方案名作为前缀的方式来使用其他用户所创建的方案同义词,如图1.3.4所示。
图1.3.4其他用户使用另一个用户创建的方案同义词
(2)通过自己的方案同义词访问其他方案中的对象。
通过在自己的方案中创建指向其他方案中对象的方案同义词,SCOTT用户给HR用户授予dept表上的SELECT对象权限,HR用户在自己的方案中创建一个指向SCOTT用户的dept表的syn_scott_dept方案同义词,则HR用户可以通过自己的syn_scott_dept方案同义词来查询SCOTT用户的dept表,如图1.3.5所示。
图1.3.5通过自己的方案同义词访问其他方案中的对象
2.使用公用同义词
与方案同义词不同,如果使用公用同义词来访问其他方案中的对象,就不需要在该公用同义词前面添加方案名。
但是,如果用户没有被授予访问该公用同义词所引用的对象的对象权限,仍然不能使用该公用同义词,如图1.3.6所示。
图1.3.6使用公用同义词
3.1.6删除同义词
删除同义词后,同义词所引用的基础对象不会受影响。
1.删除方案同义词
用户能够删除自己方案中的任何方案同义词,但若需要删除其他用户方案中的方案同义词,必须拥有DROPANYSYNONYM系统权限。
DROPSYNONYMsynonym_name
2.删除公用同义词
需要删除公用同义词时,用户必须具有DROPPUBLICSYNONYM系统权限。
DROPPUBLICSYNONYMsynonym_name
3.2序列
3.2.1序列概述
与视图、约束相似,序列也不占用实际的存储空间,而只在数据字典中保存序列的定义。
引入序列的理由或序列的主要用途在于以下几点。
1.主键、外键值应用需求
在某些表中,主键可能需要由几个字段组成,如果将这些字段合起来作为主键,就会使问题复杂化。
因此,可以使用简单的顺序号来代替多个字段的主键标识记录,以简化子表对于父表的引用关系。
如果在一个数据库应用中创建一个序列,使各个表都使用这个序列产生的整数作为主键、外键值,则会对数据库的设计、编程、各种主键和外键关系的建立都起到良好的作用。
2.流水号应用需求
在现实生活中,很多情况下都需要流水号。
例如,商场打印销售单时需要将销售单按顺序编号,一般每张销售单对应一个编号,且编号是依次递增的。
如果需要产生诸如此类的单据流水号,则可以借助序列来完成。
3.序列的生成与定义的内容
序列由Oracle服务器端产生,所有的序列都出自一处。
如果有多个用户同时向序列提出申请,则序列会按照串行机制依次处理各个用户的请求,绝不会生成两个相同的整数。
而且序列生成下一个整数的速度很快,即使在并发用户数量很多的联机事务处理环境中,也不会产生明显的延迟。
说明
3.2.2创建序列
需要在自己的方案中创建序列时,用户必须具有CREATESEQUENCE系统权限;
需要在其他的方案中创建序列时,用户必须具有CREATEANYSEQUENCE系统权限。
CREATESEQUENCEsequnce_name
[STARTWITHn1]
[INCREMENTBYn2]
[{MAXVALUEn3|NOMAXVALUE}]
[{MINVALUEn4|NOMINVALUE}]
[{CACHEn5|NOCACHE}]
[{CYCLE|NOCYCLE}]
[ORDER];
其中:
(1)STARTWITH:
指定要生成的第一个序列号。
(2)INCREMENTBY:
用于指定序列号之间的间隔,默认值为1。
如果n为正值,则生成的序列将按升序排列;
如果n为负值,则生成的序列将按降序排列。
(3)MAXVALUE:
指定序列可以生成的最大值,必须大于或等于STARTWITH中的n1,并且必须大于MINVALUE中的n4。
(4)NOMAXVALUE:
用于指定序列没有上限,最大值可达1027。
(5)MINVALUE:
指定序列可以生成的最小值,必须小于或等于STARTWITH中的n1,并且必须小于MAXVALUE中的n3。
(6)NOMINVALUE:
用于指定序列没有下限,最小值可达10-26。
(7)CACHE:
用于指定在高速缓存中可以预分配的序列号个数,默认为20。
(8)NOCACHE:
用于指定在高速缓存中不预先分配序列号,即序列生成器会每次生成一个序列号,这是默认值。
(9)CYCLE:
用于指定在达到序列的最大值或最小值后是否循环,即再次从n1开始生成序列号。
默认为NOCYCLE,不循环。
(10)ORDER:
用于指定按顺序生成序列号。
在图1.3.7中,SCOTT用户创建了一个seq_id序列,利用这个序列可以为其方案中的表生成唯一的整数。
图1.3.7创建序列
该序列从300开始,每次增量为1,最大值为999999999,每次生成10个序列号,到达最大值后不循环。
3.2.3使用序列
1.NEXTVAL和CURRVAL列
在引用序列时,需要使用到序列的NEXTVAL和CURRVAL两个列:
NEXTVAL列返回序列生成的下一个值,CURRVAL列返回序列生成的当前值。
2.序列的初始化
在第一次引用CURRVAL列之前,必须引用过一次NEXTVAL列,用于初始化序列的值,否则会出现错误提示,如图1.3.8所示。
图1.3.8序列的初始化
3.在SQL语句中使用序列
在SQL语句中,可以直接使用引用序列的值。
图1.3.9中先创建了一张tb_test表,然后使用seq_id序列生成的整数作为该表的主键值。
图1.3.9在SQL语句中使用序列
3.2.4更改序列
需要更改自己方案中的序列时,用户必须具有ALTERSEQUENCE系统权限;
需要更改其他方案中的序列时,用户必须具有ALTERANYSEQUENCE系统权限。
需要注意的是,不能修改序列中的起始值,如果要修改起始值,必须删除序列再重建。
更改序列包括:
(1)修改MAXVALUE和MINVALUE。
(2)修改INCREMENT增量值。
(3)修改缓存中的序列的数目。
ALTERSEQUENCEsequnce_name
[INCREMENTBYn2]
[{MAXVALUEn3|NOMAXVALUE}]
[{MINVALUEn4|NOMINVALUE}]
[{CACHEn5|NOCACHE}]
[{CYCLE|NOCYCLE}]
图1.3.10中演示了对seq_id序列进行更改的过程。
图1.3.10更改seq_id序列
思考
3.2.5删除序列
需要删除自己方案中的序列时,用户必须具有DROPSEQUENCE系统权限;
需要删除其他方案中的序列时,用户必须具有DROPANYSEQUENCE系统权限。
DROPSEQUENCEsequence_name
图1.3.11中的代码用于删除上述创建的序列seq_id。
图1.3.11删除序列
3.3视图
3.3.1视图概述
视图是查看和操作表数据的一种方法。
使用视图有诸多优点,如提供各种数据表现形式、提供某些数据的安全性、隐藏数据的复杂性、简化查询语句、执行特殊查询、保存复杂查询等。
在许多方面,视图的使用和管理都与表相似,例如都可以被创建、更改和删除,都可以通过它们来操作数据库中的数据。
除了SELECT之外,视图在INSERT、UPDATE和DELETE方面受到了某些限制。
3.3.2创建视图
需要在当前方案中创建视图时,用户必须具有CREATEVIEW系统权限;
需要在其他方案中创建视图时,用户必须具有CREATEANYVIEW系统权限。
视图的拥有者必须被明确授予访问在视图定义中所参考的所有基础对象的权限。
例如,如果视图的拥有者只具有在SCOTT方案的emp表上INSERT对象的权限,则该视图仅能用于在emp表中插入新行,而不能进行SELECT、UPDATE、DELETE等操作。
CREATE[ORREPLACE][FORCE]VIEWview_name
[(alias1,alias2..)]
ASselect_statement
[WITHCHECKOPTION[CONSTRAINTconstraint]]
[WITHREADONLY];
(1)ORREPLACE:
如果视图已经存在,该选项将重新创建该视图。
(2)FORCE:
无论基表是否存在,都将创建视图。
(3)view_name:
指定创建视图时的名称。
(4)alias:
指定由视图的查询所选择的表达式或列的别名。
别名的数目必须与视图所选择的表达式的数目匹配。
(5)select_statement:
创建视图时的SELECT语句。
(6)WITHCHECKOPTION:
在使用视图时,检查涉及的数据是否能通过SELECT子查询的WHERE条件,否则不允许操作并返回错误提示。
(7)WITHREADONLY:
创建的视图只能用于查询,而不能用于更改数据。
该子句不能与ORDERBY子句同时存在。
在图1.3.12中,在给SCOTT用户授予CREATEVIEW系统权限之后,SCOTT用户就能在自己的方案中创建基于emp表的视图v_scott_1。
图1.3.12创建视图
在图1.3.13中,在创建视图时,可以指定WITHREADONLY选项,使该视图只用于执行SELECT语句,而禁止执行INSERT、UPDATE和DELETE语句。
图1.3.13创建具有WITHREADONLY选项的视图
在图1.3.14中,在创建视图时,还可以指定WITHCHECKOPTION选项,该选项用于在视图上定义CHECK约束,并可以使用CONSTRAINT选项指定约束的名称。
之后在此类视图上执行DML操作时,就要求所操作的数据必须满足SELECT子查询中的WHERE条件。
图1.3.14创建WITHCHECKOPTION的视图
3.3.3强制创建视图
正常情况下,如果基本表不存在,则创建视图会失败;
但如果创建视图的语句没有语法错误,则只要使用FORCE选项即可创建该视图,这种强制创建的视图被称为带有编译错误的视图。
此时,这种视图处于失效状态,不能执行该视图,但之后随着基础表的创建,该视图就可以正常运行了。
图1.3.15将演示强制创建视图的过程。
图1.3.15强制创建视图
3.3.4在连接视图上执行DML操作
对于在视图上进行的所有DML操作,最终都会在基础表的数据上完成。
可以像对普通表一样对视图进行SELECT操作,但如果需要对视图进行更新(包括UPDATE、DELETE、INSERT)操作,则会受到某些限制,即并非在所有的视图上都可以执行全部的DML操作。
对于一个基于基础表的简单视图而言,它只是简单地去掉了基础表中的某些记录或某些列,但如果视图中包括基础表的键(主键、外键),则总可以在其上进行DML操作。
与简单视图相对应,当一个视图基于多个基础表(或视图)时,即定义视图的查询是一个连接查询,这类视图被称为连接视图。
对于连接视图,有些可以更新,但有些不能更新。
1.可更新连接视图
当创建连接视图的SELECT子句满足以下条件时,连接视图是可更新的:
(1)不包含集中运算符(UNION、UNIONALL、INTERSECT、MINUS等)。
(2)不包含DISTINCT关键字。
(3)不包含GROUPBY、ORDERBY、CONNECTBY或STARTWITH子句。
(4)不包含子查询。
(5)不包含分组函数。
(6)需要更新的列不是由列表达式定义的。
(7)表中所有的NOTNULL列均属于该视图。
但是,这只是最基本的条件,即并非在可更新连接视图中就可以进行更新操作了,还需要遵守更新标准,也就是只能对“键值保存表”进行更新。
2.键值保存表
如果连接视图中的一个基础表的主键(主键、唯一键)在它的视图中仍然存在,则称这个基础表为键值保存表。
创建关于SCOTT方案中DEPT表和EMP表的连接视图,如图1.3.16所示。
图1.3.16对连接视图的键值保存表进行更新
在EMP表中,EMPNO列是该表上的主键;
而在DEPT表中,DEPTNO是该表中的主键。
EMPNO可以同时作为视图v_dept_emp_1视图的主键,但DEPTNO不能作为该视图的主键,所以EMP是键值保存表,而DEPT表则不是。
值得注意的是,对于在连接视图上的任何INSERT、UPDATE或DELETE操作,一次只能对视图中的一个键值保存表进行更新。
3.3.5查询视图信息
1.查询视图的可更新列
可以使用USER_UPDATABLE_COLUMNS数据字典来查询当前用户方案中所有的表以及视图中所有可修改的列。
图1.3.17中的代码用于查询v_dept_emp_1视图中所有可更新的列。
图1.3.17查询v_dept_emp_1视图中所有可更新的列
2.查询视图的定义信息
可以使用USER_VIEWS数据字典来查询当前方案中视图的定义信息。
图1.3.18中的代码用于查询v_dept_emp_1视图的定义信息。
图1.3.18查询v_dept_emp_1视图的定义
3.3.6删除视图
可以删除当前模式中的各种视图,需要删除其他方案中的视图时,必须拥有DROPANYVIEW系统权限。
DROPVIEWview_name
图1.3.19中的代码用于删除上述创建的v_dept_emp_1视图。
图1.3.19删除视图
3.4索引
3.4.1索引概述
通过在表中的一个或多个列上创建索引,就能为数据的检索提供快捷的存取路径,减少查询时的硬盘I/O操作,加快数据的检索速度。
与其他具有独立存储结构的方案对象类似,索引需要占用实际的存储空间。
一旦创建了索引,在表上执行DML操作时,Oracle就会自动地对索引进行维护,并且由Oracle决定何时使用索引,用户完全不需要考虑在SQL语句中指定使用哪个索引以及如何使用索引。
如果将表看成一本书,则索引的作用类似于书中的目录。
需要在表中查询指定的记录时,在没有索引的情况下,必须遍历整张表中的记录;
但如果存在索引,则只需要先在索引中找到符合查询条件的索引列值,然后通过保存在索引中的ROWID即可快速找到表中对应的记录。
因此,为表建立索引能够减少查询操作的时间并减少I/O操作的开销。
3.4.2创建索引
可以使用CREATEINDEX命令在一列或若干列的组合上创建索引。
需要在自己的方案中创建索引时,必须拥有CREATEVIEWINDEX系统权限;
需要在其他用户的方案中创建索引时,必须拥有CREATEANYINDEX系统权限。
CREATEINDEXindex_nameontable_name(colummlist)
[TABLESPACEtablespace_name]
(1)index_name:
指定所创建的索引名。
(2)table_name:
指定创建索引的表名。
(3)column_list:
指定在表上创建索引的列名列表,可以基于多列创建索引。
(4)tablespace_name:
为索引指定表空间。
在创建索引时,会对表进行扫描,对索引列的数据进行排序,为索引分配存储空间,将索引的定义信息存储到数据字典中。
创建后的索引完全由Oracle自动管理、维护和使用。
图1.3.20中的代码用于为SCOTT方案中的emp表创建基于sal的索引。
图1.3.20创建索引
即使在表中创建了索引,Oracle也不是机械地为该表上的所有查询都使用索引,而是根据查询的具体情况决定是否使用索引。
在运行查询语句之前,Oracle一般需要对其进行优化。
优化的目的是找到运行该查询语句的最佳途径。
Oracle会使用两种优化器:
RBO优化器(RuleBasedOptimizer,基于规则的优化器)、CBO优化器(CostBasedOptimizer,基于开销的优化器)。
优化器会将使用全表扫描所需的资源开销与使用索引所需的资源开销进行对比,如果使用全表扫描所需的资源开销更节省,则不会使用索引。
使用全表扫描所需的资源与表中数据量的大小密切相关。
一般而言,当表中数据量达到一定数量时,优化器才会考虑使用索引。
以下通过一个示例来说明索引可以大大提高查询的效率,步骤如下:
1.创建用于测试的表
以SYS方案中的dba_objects表为参考数据,在SCOTT方案中创建一张用于测试的tb_idx_test表,如图1.3.21所示。
为了使SCOTT用户查询SYS方案中的dba_objects表,必须首先为SCOTT用户赋予SELECT对象权限。
图1.3.21创建用于测试索引的大数据表
2.通过查询查看执行计划
以object_name为查询条件,查询tb_idx_test表中的记录,并显示执行计划,如图1.3.22所示。
图1.3.22
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 管理 数据库 对象