oracle06-数据库对象
一、数据库对象
? ? 1.1 什么是数据库对象
?? ?说白了就是pl/sql软件my objects里面的东西,最基本的可以理解为表。
?? ?数据库对象又称模式对象,是逻辑结构的集合。
? ?? ?最基本的数据库对象就是表。
?? ?数据逻辑结构:指的是存在一种或多种特定关系的数据元素集合。
?? ?通俗点:就是把数据元素形象地进行了有规则排列,但不用考虑在计算机上如何实现。
?? ?再通俗点:就是数据有规则的排列。表不就是有规则的排列吗?
? ?? ?数据库对象包括:
? ?? ?同义词、序列、视图、索引、表、函数、包、过程、触发器等。
?? ?指针
?? ?1.table:基本的数据库对象,由行和列组成
?? ??? ?创建表,数据类型,约束对象,简单的CURD(增删改查)
?? ??? ?了解:手动添加,删除字段,类型,约束
?? ??? ??? ?alter ? ? create drop
?? ?2.view:视图,虚拟表
?? ?3.sequence:序列
?? ?4.index:索引
?? ?5.synonym:同义词
?
? ? 1.2 同义词 synonym
?? ?A ?B
?? ?A用户:创建一个表 tb_sb
?? ?B用户:能访问A用户的tb_sb
?? ?同义词是数据库方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。
?? ?通过创建一个同义词(对象的另外一个名字)来简化对数据库中对象的存取。
?? ?缩短了对象的名字的长度
?? ?语法:
?? ??? ?create [public] synonym 同义词名字 for object;
?? ?同义词分类:私有同义词&&公有同义词
?? ?
?? ?1.2.1 私有同义词
?? ? ? ?只能被当前用户访问,而且不能与当前模式的对象相同,就是有的对象有这名字了就不能取了。
?? ?**创建私有同义词
?? ??? ?create sysnonym aa for scott.emp;--aa为名字,可自定义,执行如果出现权限不足错误,可以使用管理员给予权限
?? ?**给予权限:使用sys登录后,手动点击user找到scott用户,点击编辑,给系统权限加:
?? ??? ?create synonym--创建私有同义词
?? ?
?? ?**查看同义词
?? ??? ?select * from aa;--使用同义词得到emp表数据,后期有需求再用,先理解制作方式。
?? ?1.2.2 公有同义词
?? ? ? ?由一个特殊的用户组Public所拥有。顾名思义,数据库中所有的用户都可以使用公用同义词。
?? ?**创建公有同义词
?? ??? ?create public synonym bb for scott.emp;--会提示权限不足
?? ?**解决权限问题:使用sys登录后给予权限
?? ??? ?grant create public synonym to scott;?
?? ?**撤销权限
? ?? ??? ?revoke create ?public synonym from scott;
? ? 1.3 序列:用于生成唯一、连续序号的值,类似sqlserver中的标识列
?? ?概述:
?? ??? ?①自动产生唯一的数字
?? ??? ?②是一个可以共享的数据库对象
?? ??? ?③典型地用于产生数据库表中的主键值
?? ??? ?④能够节省应用程序的代码
?? ??? ?⑤当缓存在内存中时,能够提高存取的效率。
?? ?**创建序列
?? ? ? ?create sequence seq0212--创建名字
?? ? ? ?start with 1--开始从1
?? ? ? ?increment by 1--自增长为1
?? ? ? ?maxvalue 100--最大值
?? ? ? ?minvalue 1--最小值
?? ?nextval:返回下一个可用的序列值,每访问一次,它将产生一个唯一的新值,即使对不同的用户,该值也是唯一的。
?? ?currval:返回当前的序列值,只有当nextval被访问之后,currval伪列才能包含一个值。
?? ?
?? ?**使用序列
?? ?***取下一个值 值每运行一次增长,相当于于标识列,不能回去。
?? ? ? ?select scott.seq0212.nextval from dual;
?? ?***取当前的值 值回不去 除非删除序列
?? ? ? ?select scott.seq0212.currval from dual;
?? ? 删除序列
?? ?使用drop sequence命令来删除一个数据字典的序列
?? ?一旦序列被删除,那么被序列就不可以访问了。
?? ?
?? ?序列的作用:Oracle中没有标识列,所以让序列当作标识列,后期会与触发器配合使用
?? ?
?? ?【案例】创建表 ?插入数据 ?使用nextval
? ? 1.4 视图:存储一个后者多个表数据的虚拟表
?? ?【需求】显示dept表和emp表中部门和部门编号,员工和员工薪水,存储到视图中
?? ??? ?【注意】需要权限
?? ?【需求】求每个部门的平均薪资
?? ?【需求】修改数据,如果不是原数据就会失败
?? ?概述
?? ?视图,就是一张虚拟表,我们可以从这个表中查询数据
?? ?视图,就是一个命名的查询的语句
?? ?create view 视图名称 as select...
?? ?删除视图:不会影响原来的数据
?? ?drop view 视图名称
? ? 1.5 索引:相当与书的目录,可以大大的提供我们的速度
? ? --在普通情况下不会有区别,当数据多的情况下,加索引就会提升查询速度,了解一下
? ? --会鼠标创建即可:点击表,右击编辑,可以看到索引,给列添加索引就好了
? ? --PPT上看一下,了解下就可以
? ? --索引的优点:大大提升查询速度
?? ?
?? ?1.5.1 概述
?? ?①一个数据库模式对象
?? ?②Oracle利用索引来加快对数据行的访问
?? ?③依靠索引来快速定位数据,从而 减少了磁盘I/O的次数
?? ?④与使用它的表是相互独立的数据库对象
?? ?⑤Oracle服务器自动对索引进行维护和使用
? ? ?? ?1.5.2 创建索引的2种方式
?? ?①自动创建:Oracle辉自动为主键(primary key)和唯一键(unique)创建索引
?? ?自动创建的索引是无法删除的。
?? ?alter table emp?
?? ?add constraints ename_uni unique(ename);
?? ?alter table emp
?? ?drop constraints ename_uni;
?? ?②可以手动的创建索引,表中什么样的字段应该添加索引?
?? ? ?在查询的时候,经常被用来作为查询添加的字段,应该添加索引。
?? ? ?create index ename_index on emp(ename);
?? ? ?select * from emp where ename = 'smith'
?? ?
?? ?③什么时候创建索引?
?? ??? ?a.欲创建索引的列在where子句或者连接条件中频繁使用
?? ??? ?b.该列所包含的不同值很多
?? ??? ?c.该列包含大量的空值
?? ??? ?d.表中的数据库行数非常大,而且只有2-4%数据行被查询出来
?? ?
?? ?④什么时候不必创建索引
?? ??? ?a.表是空的
?? ??? ?b.列在查询条件中不经常使用
?? ??? ?c.大多数基于该表的查询,所查询出的数据量远多于2-4%行。
?? ??? ?d.表被频繁修改
?? ?⑤删除索引
?? ?drop index 索引名称;
?? ??? ?
------代码
Oracle 创建视图view 权限不足,无法创建 解决办法
Oracle?
在创建用户的时候如果直接给用户DBA权限,那么在B用户中可以直接查询A用户的表,但是在创建视图时就会报无权限,在这种情况下需要再在被访问的A用户里面去给予要访问该表的B用户授权。?
--创建视图权限,一般网上找都是说的这句,但是光有这句还是无法创建?
grant create ?view to B;?
--授予查询权限?
grant select any table to B;?
--授予权限?
grant select any dictionary to B;?
select * from dba_synonyms where table_owner='SCOTT';
drop ?public synonym paaa