暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C入门到精通之视图对象与同义词对象

ITPro进化论 2023-12-29
255

视图是一个虚拟表,它由存储的查询构成,可以将它的输出视为一个表。视图同真实表一样,也可以包含一系列带有名称的列和行数据。但是,视图并不在数据库中存储数据值,其数据值来自定义视图的查询语句所引用的表,数据库只在数据字典中存储视图的定义信息。

视图既可以建立在关系表上,也可以建立在其他视图上,或者同时建立在二者之上。视图看上去非常像数据库中的表,甚至可以在视图中进行INSERT、UPDATE和DELETE操作。通过视图修改数据时,实际上就是在修改基本表中的数据。与之相对应,改变基本表中的数据也会反映到由该表组成的视图中。

1. 创建视图

创建视图是使用CREATE VIEW语句完成的。为了在当前用户模式中创建视图,要求数据库用户必须具有CREATE VIEW系统权限;如果要在其他用户模式中创建视图,则用户必须具有CREATE ANY VIEW系统权限。创建视图最基本的语法如下:

CREATE [OR REPLACEVIEW <view_name> [(alias[,alias]…) ] AS <subquery> 
[WITH CHECK option] [CONSTRAINT constraint_name] 
[WITH READ ONLY]

  • alias:用于指定视图列的别名。
  • subquery:用于指定视图对应的子查询语句。
  • WITH CHECK option:该子句用于指定在视图上定义的CHECK约束。
  • WITH READ ONLY:该子句用于定义只读视图。

在创建视图时,如果不提供视图列别名,Oracle会自动使用子查询的列名或列别名;如果视图子查询包含函数或表达式,则必须定义列别名。

1.1. 创建简单视图

简单视图是指基于单个表建立的,不包含任何函数、表达式和分组数据的视图。

--创建一个查询部门编号为20的记录的视图
create or replace view emp_view as
select empno,ename,job,deptno from emp
where deptno=20;

--通过SELECT语句查询视图emp_view
select * from emp_view;

对于简单视图而言,不仅可以执行SELECT操作,还可以执行INSERT、UPDATE、DELETE等操作。

首先向视图emp_view中插入一条记录,然后修改这条记录的ename字段值,接着查询emp_view视图中的信息,最后删除该记录并提交到数据库,代码如下:

--向视图emp_view插入一条记录
insert into emp_view values (6666,'南方','MANAGER',20);

--修改emp_view视图刚刚插入的这条记录
update emp_view set ename='北方' where empno=6666;

--删除emp_view视图中empno=6666的记录
delete from emp_view where empno=6666;

系统在执行CREATE VIEW语句创建视图时,只是将视图的定义信息存入数据字典中,并不会执行其中的SELECT语句。在对视图进行查询时,系统才会根据视图的定义从基本表中获取数据。由于SELECT是使用最广泛、最灵活的语句之一,通过它可以构造一些复杂的查询,从而构造一个复杂的视图。

1.2. 创建只读视图

建立视图时可以指定WITH READ ONLY选项,该选项用于定义只读视图。定义了只读视图后,数据库用户只能在该视图上执行SELECT语句,而禁止执行INSERT、UPDATE和DELETE语句。

在scott模式下,创建一个只读视图,要求该视图可以获得部门编号不等于88的其他所有部门信息,代码如下:

create or replace view emp_view_readonly as
 select * from dept
 where deptno != 88
 with read only;

只能在该视图上执行SELECT操作,而禁止任何DML操作,否则Oracle将提示错误信息,通过只读视图emp_view_readonly修改所有部门的位置为“长春”,代码如下:

update emp_view_readonly set loc='北京';

1.3. 创建复杂视图

复杂视图是指包含函数、表达式或分组数据的视图。使用复杂视图的主要目的是简化查询操作。需要注意的是,当视图子查询包含函数或表达式时,必须为其定义列别名。复杂视图主要用于执行查询操作。

在scott模式下,创建一个视图,要求能够查询每个部门的工资情况,代码如下:

create or replace view emp_view_complex as
select deptno 部门编号,max(sal) 最高工资,min(sal) 最低工资,avg(sal) 平均工资
from emp
group by deptno;

1.4. 连接视图

连接视图是指基于多张表所建立的视图。使用连接视图是为了简化连接查询。需要注意的是,建立连接视图时,必须使用WHERE子句指定有效的连接条件,否则结果就是毫无意义的笛卡儿积。

在scott模式下,创建一个dept表与emp表相互关联的视图,并要求该视图只能查询部门编号为20的记录信息,代码如下:

create or replace view emp_view_union as
select d.dname,d.loc,e.empno,e.ename
from emp e,dept d
where e.deptno = d.deptno and d.deptno = 20;

2. 管理视图

在创建视图后,还可以对视图进行管理,主要包括查看视图定义、修改视图定义、重新编译视图和删除视图等。

2.1. 查看视图定义

数据库并不存储视图中的数值,而是存储视图的定义信息。用户可以通过查询数据字典视图user_views,以获得视图的定义信息。

SQL * Plus中使用DESC命令查看user_views数据字典的结构,代码如下:

desc user_views;

在user_views数据字典中,TEXT_VC列存储了用户视图的定义信息,即构成视图的SELECT语句。通过数据字典user_views查看视图emp_view_union的定义,代码如下:

select text_vc from user_views where view_name = upper('emp_view_union');

2.2. 修改视图定义

建立视图后,如果要改变视图所对应的子查询语句,则可以执行CREATE OR REPLACE VIEW语句。

修改视图emp_view_union,使该视图实现查询部门编号为30的记录的功能(原查询信息是部门编号为20的记录),代码如下:

create or replace view emp_view_union as
select d.dname,d.loc,e.empno,e.ename
from emp e,dept d
where e.deptno = d.deptno and d.deptno = 30;

在上面的代码中,起到至关重要作用的关键字是REPLACE,它表示使用新的视图定义替换旧的视图定义。

2.3. 重新编译视图

视图被创建后,如果修改了视图所依赖的基本表定义,则该视图会被标记为无效状态。当访问视图时,Oracle会自动重新编译视图。除此之外,也可以使用ALTER VIEW语句手动编译视图。

--通过手动方式重新编译视图emp_view_union
alter view emp_view_union compile;

2.4. 删除视图

当不再需要视图时,用户可以执行DROP VIEW语句删除视图。用户可以直接删除其自身模式中的视图,但如果要删除其他用户模式中的视图,则要求该用户必须具有DROP ANY VIEW系统权限。

--删除视图emp_view_union
drop view emp_view_union;

执行DROP VIEW语句后,视图的定义将被删除,这对视图内所有的数据没有任何影响,它们仍然存储在基本表中。

3. 同义词对象

同义词是表、索引、视图等模式对象的一个别名。通过模式对象创建同义词,可以隐藏对象的实际名称和所有者信息,或者隐藏分布式数据库中远程对象的设置信息,由此为对象提供一定的安全性。与视图、序列一样,同义词只在Oracle数据库的数据字典中保存其定义描述,因此同义词也不占用任何实际的存储空间。

在开发数据库应用程序时,应该尽量避免直接引用表、视图或其他数据库对象的名称,而改用这些对象的同义词。这样可以避免当管理员对数据库对象做出修改和变动之后,必须重新编译应用程序。使用同义词后,即使引用的对象发生变化,也只需要在数据库中对同义词进行修改,而不必对应用程序做任何改动。

Oracle中的同义词分为两种类型,即公有同义词和私有同义词。公有同义词被一个特殊的用户组public所拥有,数据库中的所有用户都可以使用公有同义词;而私有同义词只被创建它的用户所拥有,只能由该用户以及被授权的其他用户使用。

建立公有同义词是使用CREATE PUBLIC SYNONYM语句完成的。如果数据库用户要建立公有同义词,则要求该用户必须具有CREATE PUBLIC SYNONYM系统权限。

在system模式下,为scott模式下的dept表创建一个public同义词,代码如下:

create public synonym public_dept for scott.dept;

执行上述语句,将建立公有同义词public_dept。因为该同义词属于public用户组,所以所有用户都可以直接引用该同义词。需要注意的是,如果用户要使用该同义词,则必须具有访问scott.dept表的权限。

--使用SELECT语句并通过同义词public_dept来访问dept表
select * from public_dept;

使用SELECT语句通过同义词public_dept访问dept表时,用户必须有访问scott.dept表的权限。

建立私有同义词是使用CREATE SYNONYM语句完成的。如果在当前模式中创建私有同义词,那么数据库用户必须具有CREATE SYNONYM系统权限;如果要在其他模式中创建私有同义词,那么数据库用户必须具有CREATE ANY SYNONYM系统权限。

--为dept表创建私有同义词private_dept
create synonym private_dept for dept;

私有同义词只有当前用户可以直接引用,其他用户在引用时必须带模式名。

当基础对象的名称和位置被修改后,需要重新为它建立同义词。用户可以删除自己模式中的私有同义词。当需要删除其他模式中的私有同义词时,用户必须具有DROP ANY SYNONYM系统权限;当需要删除公有同义词时,用户必须具有DROP PUBLIC SYNONYM系统权限。删除同义词需要使用DROP SYNONYM语句,如果要删除公有同义词,则还需要指定PUBLIC关键字。

--使用DROP SYNONYM语句删除私有同义词private_dept
drop synonym private_dept;

--使用DROP PUBLIC SYNONYM语句删除公有同义词public_dept
drop public synonym public_dept;

删除同义词后,同义词的基础对象不会受到任何影响,但是所有引用该同义词的对象将处于INVALID状态。

今天的文章就到这里,如果对你有用,记得点个【】和【在看】,感谢阅读~

文章转载自ITPro进化论,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论