📜  创建其他架构对象

📅  最后修改于: 2020-12-29 04:26:23             🧑  作者: Mango


除表外,其他必要的架构对象是视图,序列,索引和同义词。视图是逻辑或虚拟表。同义词只是数据库对象的别名。同义词还通过掩盖数据库对象的实际名称来简化查询编写并提供系统安全性的元素。序列是支持自动生成整数值的特殊数据库对象,通常用于生成表的主键值。在表列上创建索引,以方便从表中快速检索信息。

观看次数

数据库视图是基于查询的逻辑或虚拟表,就像表一样查询视图,这意味着从您作为开发人员的角度或从数据库系统用户的角度来看,一个视图就像一个表。因为对象存储在数据库的数据字典中;但是,视图本身不存储任何数据。数据库还存储用于创建视图的执行计划-这意味着即使不存储视图的SELECT查询提供的实际数据,也可以通过使用视图来快速检索数据。而是,每次从为其定义了视图的数据库表中查询视图时,数据就被“聚集在一起”,这些表被称为基础表。

通用语法如下。

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW [ViewName]
[(Column Alias Name...)] 
AS [Query]
[WITH [CHECK OPTION] [READ ONLY] [CONSTRAINT]];

从语法上

即使该视图引用的基表尚不存在,FORCE选项也允许创建视图。此选项用于在实际创建基表和随附数据之前创建视图。

NOFORCE选项与FORCE相反,它允许系统用户创建视图,前提是他们具有创建视图所需的特权,并且用于创建视图的表已经存在。这是默认选项。

使用WITH READ ONLY选项可以创建只读视图。您不能使用DELETE,INSERT或UPDATE命令修改只读视图的数据。

WITH CHECK OPTION子句允许更新可通过视图选择的行,还使您可以指定值的约束.CONSTRAINT子句与WITH CHECK OPTION子句一起使用,以使数据库管理员可以分配唯一的名称如果数据库管理员省略了CONSTRAINT子句,则Oracle将自动为约束分配一个系统生成的名称,该名称不会很有意义。

视图类型

仅在一个表的顶部创建一个简单视图。它是一个简单的SELECT查询,没有函数或组子句,但仅从表中选择列而不进行任何转换。如果在视图上执行DML,则会直接反映出来在基本表中。

使用联接在多个表上创建复杂视图。它可以包含SQL函数,按函数分组。但是由于该视图位于多个数据上,并且列的选择也不简单,因此不允许对其进行DML操作。

插图

简单视图:下面的简单视图为JOB ID为DEV的员工选择员工名称,部门ID和薪水。

CREATE OR REPLACE VIEW v_emp_dev
AS
SELECT first_name, department_id, salary
FROM employees
WHERE job_id = 'DEV';

复杂视图:下面的示例显示部门名称,部门中的平均工资以及在该部门工作的员工人数。

CREATE OR REPLACE VIEW EMP_VU
AS
SELECT department_name, AVG (salary) avg_sal, COUNT (first_name) count
FROM employees E, departments D
WHERE E.department_id = D.department_id
GROUP BY department_name;

DESCRIBE [视图名称]描述视图结构。列以与视图定义相同的顺序列出。

视图上的DML操作

DML操作可以在简单的视图上轻松执行。如前所述,插入,更新和删除操作实际上发生在基表上。

在视图上执行UPDATE,DELETE或INSERT DML语句时,实际上是在操纵定义了该视图的一个或多个基表的数据行。使用UPDATE,DELETE和INSERT语句受到限制首先,要对视图使用UPDATE,DELETE或INSERT语句,该视图必须是可更新的。如果SELECT子句未在SELECT列表中指定任何聚合函数,则该视图是可更新的。通过使用GROUP BY,DISTINCT或UNION子句创建的。允许在FROM子句的SELECT子查询中使用聚合函数。另外,视图在SELECT列表中不能有任何派生列。接下来,如果一个视图是作为JOIN操作的结果创建的(一个联接视图),则UPDATE和INSERT语句一次只能修改行或将行插入基表之一。您不能使用单个数据操作语言(DML)语句来修改两个或多个表中的行。最后,如果在FROM子句中引用了表,则DELETE语句只能对视图执行。这仅表示您无法从未指定的表中删除行。

WITH CHECK OPTION子句

WITH CHECK OPTION是一个可选子句,用于指定通过视图插入或更新数据时要执行的检查级别。如果使用WITH WITH CHECK OPTION子句创建视图,则通过该视图在基表中插入或更新的每一行必须符合视图定义。请注意,如果将视图创建为只读,则不能指定该选项。

例如,为开发人员(JOB_ID = DEV)的雇员创建视图V_EMP_DEV。

CREATE OR REPLACE VIEW v_emp_dev
AS
SELECT first_name, department_id, salary, 
FROM employees
WHERE job_id = 'DEV'
WITH CHECK OPTION empvu_dev;

用户尝试通过该视图更新HR员工的薪水,但遇到异常。这是因为视图是使用WITH CHECK OPTION创建的。

UPDATE v_emp_dev
SET salary = salary+500
WHERE JOB_ID = 'HR';
ORA-01402: view WITH CHECK OPTION where-clause violation

如果只是简单的视图,则UPDATE语句将不会引发任何异常。

删除视图

数据库管理员(DBA)或视图所有者可以使用DROP VIEW语句删除视图。如果视图已定义约束,则在删除视图时需要指定CASCADE CONSTRAINTS子句;如果另一个视图或其他数据库对象(例如同义词或实例化视图(本章稍后将讨论这两个对象))引用了被删除的视图,则Oracle不会删除这些数据库对象;否则,将无法处理DROP VIEW语句。相反,Oracle将它们标记为无效。您可以删除这些无效的对象或重新定义它们,以使其再次有效。

下面的DROP VIEW命令从数据库中删除视图EMP_VU。

DROP VIEW EMP_VU;

顺序

Oracle提供了生成这种类型的唯一数字序列的功能,这些序列称为序列。通常,序列用于生成唯一的序列整数值,这些整数值用作数据库表中的主键值。数字序列可以请注意,按顺序生成的数字不能回滚。

句法

CREATE SEQUENCE 
[INCREMENT BY < number >]
[START WITH < start value number>]
[MAXVALUE < MAXIMUM VLAUE NUMBER>]
[NOMAXVALUE]
[MINVALUE < minimum value number>]
[CYCLE | NOCYCLE]
[CACHE < number of sequence value to cache> | NOCACHE]
[ORDER | NOORDER];

从语法上

CREATE SEQUENCE语句必须指定唯一的序列名称。这是该语句中唯一需要的子句。如果您未指定任何其他子句,则生成的所有序列号将遵循Oracle默认设置。

INCREMENT BY子句确定在生成每个数字时序列如何递增。默认增量为1;默认为1。但是,如果您有充分的理由希望序列跳过数字,则可以指定一个不同的增量。正数字增量会生成间隔等于您选择的间隔的升序序列号。负数字增量会生成降序的序列号。

START WITH子句指定序列的起始数字值-默认起始数字为1。此外,如果已经有一些行中的数据现在将存储序列值,则必须指定一个起始值。

MAXVALUE子句指定可将序列增加到的最大值。在没有MAXVALUE的情况下,序列可生成的最大允许值非常大,从10到27的幂-1。默认值为NOMAXVALUE。

MINVALUE子句指定递减序列(一个按降序生成数字的序列)的最小值。默认值为NOMINVALUE。

CYCLE子句指定如果序列达到指定的MAXVALUE,则可以重用序列值。如果序列循环,则会从START WITH值开始重新生成数字。

CACHE子句可以使Oracle生成指定批次的要存储在高速缓存中的序列号,从而提高系统性能。

如果不指定数字而指定CACHE,则默认高速缓存大小为20个序列号。或者,可以指定NOCACHE防止序列号的高速缓存。

ORDER子句指定按请求的确切时间顺序分配序列号。

下一个和当前

序列值是通过使用两个名为currval和nextval的伪列生成的。伪列的行为类似于表列,但伪列实际上并不存储在表中。第一次选择nextval伪列时,初始值然后返回nextval伪列,使序列按INCREMENT BY子句中的指定递增,并返回新生成的序列值.currval伪列返回序列的当前值,即最后一次参考nextval。

在会话中,NEXTVAL(而不是CURRVAL)必须是序列上的第一个操作。这是因为在会话中,当NEXTVAL从序列中生成会话的第一个数字时,Oracle将当前值保留在CURRVAL中。

句法:

Sequence.NEXTVAL
Sequence.CURRVAL

注意事项-

  • CURRVAL和NEXTVAL只能在select语句的外部SQL中使用。

  • CURRVAL和NEXTVAL可以在INSERT语句中替代列主键,既可以用作子查询子句,也可以用作VALUES子句。

  • CURRVAL和NEXTVAL可用于更新表中的值。

  • CURRVAL和NEXTVAL不能在VIEW选择列表中,不能使用DISTINCT关键字,不能在CREATE TABLE或ALTER TABLE语句中使用GROUP BY,HAVING或ORDER BY子句以及DEFAULT表达式。

修改顺序

序列所有者只能修改序列以更改属性,例如INCREMENT BY值,MINVALUE,MAXVALUE,CYCLE或CACHE子句。请注意,所做的更改将反映在即将到来的数字中。

句法:

ALTER SEQUENCE [sequence name]
INCREMENT BY n
MAXVALUE n
NOCACHE
NOCYCLE

删除序列

DROP SEQUENCE命令删除需要重新创建或不再需要的序列。

DROP SEQUENCE [sequence name]

指标

索引是用于调整SELECT查询性能的数据库对象。索引有不同类型,包括用于执行主键约束,唯一索引,非唯一索引和串联索引的索引等。查询将要求Oracle扫描表中的所有行以返回结果表所需的行。在表列上创建索引,然后将索引的所有值存储在索引段下。与序列不同,索引是表特定的。一旦删除表格,它们就会自动删除。

索引可以自动创建也可以手动创建。当您指定PRIMARY KEY约束或UNIQUE约束时,Oracle将自动创建唯一索引以支持对指定表的快速数据检索。

或者,用户可以手动创建索引以优化查询性能。手动创建的索引可以是唯一索引,也可以是非唯一索引。非唯一索引可以是B-Tree,Bitmap或基于函数的索引。默认情况下,Oracle在列上创建B-Tree索引这是语法

句法

CREATE [UNIQUE][BITMAP]INDEX index
ON table (column [, column]...);

请注意,仅必须为唯一索引和位图索引指定UNIQUE和BITMAP。默认情况下,Oracle为普通索引创建B-Tree索引。

复合索引(也称为串联索引)是在表的多个列上创建的索引。复合索引中的列可以按任何顺序出现,并且不必与表中的相邻列相同。组合索引提高了查询的行检索速度,在查询中WHERE子句引用了组合索引中列的全部或开头部分。一个索引最多可以包含32列。

例如,用户在EMPLOYEES表的HIRE_DATE列上创建索引IDX_EMP,索引使用量将通过遍历索引路径扫描来减少磁盘I / O,并找到在HIRE_DATE列上过滤的数据。

CREATE INDEX IDX_EMP ON employees(hire_date);

删除索引

索引不能修改,但可以更改以用于分析,重建或统计计算目的。如果必须修改索引定义,则必须删除并重新创建它。DROP INDEX命令的语法很简单。

DROP INDEX index_name;

同义字

同义词是别名,即一种简化形式,用于简化引用数据库对象的任务。该概念类似于为朋友和熟人使用昵称。引用另一个用户拥有的对象时,需要使用架构名称以它为前缀。借助同义词,您可以减少引用对象和架构名称的工作量。通过这种方式,同义词可提供位置透明性,因为同义词名称隐藏了实际的对象名称及其所有者。

同义词分为两类:公共和私有。公共同义词可用于允许所有系统用户轻松访问对象。实际上,创建公共同义词的个人并不拥有该同义词,而是属于Oracle内部存在的PUBLIC用户组。另一方面,私有同义词属于创建它们并驻留在其中的系统用户用户的架构。

句法

CREATE [PUBLIC] SYNONYM [synonym name] 
FOR OBJECT;

系统用户可以向其他系统用户授予使用其拥有的私有同义词的特权。要创建同义词,您需要具有CREATE SYNONYM特权。此外,您还必须具有CREATE PUBLIC SYNONYM特权才能创建公共同义词。如果将同义词声明为public,则该同义词名称不能再用作公共同义词。尝试创建已存在的公共同义词将导致CREATE PUBLIC SYNONYM命令失败,Oracle将返回ORA-00955:名称已被现有对象错误消息使用。

插图

考虑两个用户U1和U2。U1可以访问EMPLOYEES表。因此,要同时启用对EMPLOYEES表的访问U2,可以在U2模式中创建同义词。 U1必须授予对U2的访问权限。

CONN U2/U2
SQL> CREATE SYNONYM EMP_SYN    FOR U1.employees;

CONN U1/U1
SQL> GRANT ALL ON EMP_SYN TO U2;

CONN U2/U2
SQL> SELECT * FROM EMP_SYN;

删除同义词

用户可以删除其拥有的同义词。要删除公共同义词,您必须具有DROP PUBLIC SYNONYM特权。

DROP SYNONYM EMP_SYN;