6.4、视图、序列、同义词--Oracle模式对象
视图view
是一个虚拟表,不存储数据值。
Create or replace view 病人基本信息 as select 病人id,住院号,姓名,性别,年龄 from 病人信息表;
在创建视图时,只是将视图的定义存入到数据库字典中,并没有执行select查询,只有当用户对视图查询时,系统才按照视图的定义从基本表中获取数据。
视图上可进行insert、update和delete操作。
一个视图中,可以同时包含可更新的字段和不可更新的字段。
例如:
Create or replace view 病人基本信息(病人id,住院号,姓名,性别,病人年龄) as select 病人id,住院号,姓名,性别,年龄+1 from 病人信息表;
年龄字段是,由源表字段“年龄”+1计算出来的,所以病人年龄字段不能更新,其他字段可以更新。
可以通过数据字典USER_UPDATABLE_COLUMNS视图,来查询哪些字段可以更新,哪些不能更新。
WITH CHECK OPTION选项
Create or replace view stu_age_view(学生编号,学生姓名,学生年龄) as select sid,sname,sage from student where 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 s where table_owner not in ('SYSTEM', 'SYS') and db_link is null and not exists (select null from dba_objects o where s.table_owner = o.owner and s.table_name = o.object_name);
----查询当前用户下,没有创建同义词的对象有哪些?
Select * from dba_objects s where owner in ('ZLHIS') And object_type In('TABLE','PROCEDURE','FUNCTIONS') and Not exists (select null from dba_synonyms o Where o.table_owner = s.owner and o.table_name = s.object_name And o.db_link is null)