你的位置:首页 > 数据库

[数据库]6.4、视图、序列、同义词


视图view

是一个虚拟表,不存储数据值。

Create or replace view 病人基本信息asselect 病人id,住院号,姓名,性别,年龄 from 病人信息表;

在创建视图时,只是将视图的定义存入到数据库字典中,并没有执行select查询,只有当用户对视图查询时,系统才按照视图的定义从基本表中获取数据。

 

视图上可进行insert、update和delete操作。
一个视图中,可以同时包含可更新的字段不可更新的字段
例如:

Create or replace view 病人基本信息(病人id,住院号,姓名,性别,病人年龄)asselect 病人id,住院号,姓名,性别,年龄+1 from 病人信息表;

年龄字段是,由源表字段“年龄”+1计算出来的,所以病人年龄字段不能更新,其他字段可以更新。
可以通过数据字典USER_UPDATABLE_COLUMNS视图,来查询哪些字段可以更新,哪些不能更新。


WITH CHECK OPTION选项

Create or replace view stu_age_view(学生编号,学生姓名,学生年龄)asselect sid,sname,sagefrom studentwhere name='小白';

--此时这个视图是可以insert插入数据的,如下操作:

Insert into stu_age_view(学生编号,学生姓名,学生年龄)
Values(3,'小红',20);

--查询表student结果如下:
Select* from student;
SID SNAME SSEX SAGE SCLASS
---- ------- ------ ------ ------
1     小白      男      22      1
2     小明      男      21      1
3     小红               20

在更新视图时,违反了【Where name='小白'】限制条件,往表中插入了数据。
可以通过在创建表的时候使用WITH CHECK OPTION选项,有了该子句,再插入类似记录时,Oracle会提示报错ora-01402:视图 WITH CHECK OPTION子句违规。

删除视图:
Drop view stu_age_view;

 

序列sequence:
用于产生一系列唯一数字的数据库对象。不占用实际存储空间,只是在字典中保存定义
使用序列可以实现自动产生主键值。

要有创建序列的权限 create sequence 或 create any sequence

创建序列的语法:
CREATE SEQUENCE sequence_name --创建序列名称
[INCREMENT BY increment] --递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
[START WITH start] --起始值,递增默认是minvalue 递减是maxvalue
[MAXVALUE n | NOMAXVALUE] --最大值
[MINVALUE n | NOMINVALUE] --最小值
[CACHE n | NOCACHE]--预分配,并存入到内存
[CYCLE | NOCYCLE]; --循环/不循环

两个伪列:
NEXTVAL --返回序列生成的下一个值
CURRVAL --返回序列的当前值
NEXTVAL 应在 CURRVAL 之前指定 ,二者应同时有效

修改序列:
Alter sequence stu_seq increment by 2;
对序列修改后,缓存中保存的序列值将全部丢失。

删除序列:
Drop sequence stu_seq;

 

同义词synonym:
是表、索引、视图等模式对象的一个别名。不占用任何实际的存储空间。
分两类:公共同义词、私有同义词

创建同义词:
Create [public] SYNONYM synonym_name for schema_object;

删除同义词:
Drop public sysnonym pub_sysnonym_name;

----执行查找所有失效的同义词,生成删除脚本如下:

select 'drop '|| decode(s.owner,'PUBLIC','public synonym ','synonym ' || s.owner || '.')|| s.synonym_name|| ';' as "Dropping invalid synonyms:"from dba_synonyms swhere table_owner not in ('SYSTEM', 'SYS')and db_link is nulland not exists(select null from dba_objects owhere s.table_owner = o.ownerand s.table_name = o.object_name);

 

----查询当前用户下,没有创建同义词的对象有哪些?

Select *from dba_objects swhere owner in ('ZLHIS') And object_type In('TABLE','PROCEDURE','FUNCTIONS')and Not exists(select null from dba_synonyms oWhere o.table_owner = s.ownerand o.table_name = s.object_name And o.db_link is null)