您的位置:首页 > 数据库

数据库对象(同义词,序列,视图,索引)

2018-01-25 17:08 204 查看


数据库对象 DBObject

一、数据库对象

数据库对象(又称模式对象),是逻辑结构的集合,最基本的数据库对象就是-----表。

数据逻辑结构:指的是存在一种或多种特定关系的数据元素集合。

通俗点:就是数据有规则的排列。表不就是有规则的排列吗。

 

其他数据库对象包括:同义词、序列、视图、索引、表、函数、包、过程、触发器等。

二、同义词

同义词(synonym)——现有对象的一个别名。

场景:

Oracle只有一个数据库,用户的访问是通过表空间分隔开的,一般来说两个用户之间不能相互访问,但现在A用户要B用户分享某个表中的数据,那B的表空间就要给A分配个权限。

----将某个表共享,但这也向其他用户曝露了表,存在安全问题。因此,我们给要共享的表设置个同义词(别名),将同义词共享给其他用户。

 

举例:

同义词就好比我们要给这个对象取别名,也就是我们所称的“外号”,比如张新宇你们叫他“锤子”,“锤子”就是他的外号;如果某天来个IS来找“锤子”,他找得到么?找不到,“锤子”是不是很安全?IS找门卫问这里有个叫“锤子”的没有?门卫当他傻啊,如果说要找张新宇,找不找得到?找得到。

 

作用:

(1) 提高安全性

(2) 主要用于资源共享。

1. 同义词分类

l 私有同义词:只有自己使用;

只能在其模式内访问,且不能与当前模式的对象同名。

l 公有同义词:设置别名给大家使用;

公有同义词可被所有的数据库用户访问。

2. 私有同义词

基本语法:

CREATE  [OR REPLACE]  SYNONYM 同义
4000
词名 FOR 对象.表名;

 

示例:

为scott账户的emp表创建一个私有的同义词(别名)

CREATE OR REPLACE SYNONYM syn_emp FOR scott.emp;

 

提示:如果当前是用scott账户,则可以省略scott。

 

注意控权:

用户在创建同义词时,需要管理员授权。

--为scott账户授权同义词

GRANT  CREATE  SYNONYM  TO  scott;

 

权限授出后,一定要收回(取消授权),否则会乱套。

--取消scott账户的同义词授权

REVOKE  CREATE  SYNONYM  FROM  scott;

3. 公有同义词

基本语法:

CREATE  PUBLIC  SYNONYM  同义词名 FOR 对象.表名;

 

示例:

为scott账户的emp表创建一个公开的同义词(别名)

CREATE  PUBLIC  SYNONYM  syn_emp  FOR  scott.emp;

 

注意:公有的同义词不能授权,也就是普通账户不能创建公有同义词,除非是管理员账户。

4. 调用同义词

调用同义词需要管理员给普通用户授权

例如:grant select on sb
to lpf;

      给lpf授予查看sb同义词的权限

 

 

SELECT * FROM syn_emp; --syn_emp 为emp表的同义词名(别名)

5. 删除同义词

DROP  SYNONYM  syn_emp; --删除私有同义词

DROP  PUBLIC  SYNONYM  syn_emp; --删除公有同义词

 

三、序列

序列是用于生成唯一的、连续的序号的对象。

序列有升序和降序。一般都是升序。

 

作用:

能生成一组连续的、永远不重复的一组数字。

主要用于提供主键值(标识列),做分页。

 

标识种子——从什么数字开始,常用1

标识增量——每次增加的数

 

ORACLE中没有标识列,想让某列成为标识列,需要序列+触发器的配合才能实现标识列。

1. 创建序列

基本语法:

CREATE  SEQUENCE 序列名称 --序列名称建议:seq_表名

[start with n] --标识种子,从n开始,默认为1

[increment by n] --标识增量,每次递增n,负数为递减,默认为1

[maxvalue n | nomaxvalue] --最大值

[minvalue n | nominvalue] --最小值,(没太多含义)

[cycle | nocycle] --循环/不循环

[cache n | nocache]; --分配并存入到内存中

 

示例1:

CREATE  SEQUENCE  seq_emp;

 

示例2:

CREATE  SEQUENCE  seq_emp

start with 1 --从1开始

increment by 1 --每次递增1

maxvalue 99999 --最大值99999

minvalue 1; --最小值1

 

注意事项:一张表一个序列,且序列不要轻易的删掉,会造成数据的混乱。

2. 应用序列

通过序列的伪列来访问序列的值。

NEXTVAL——返回序列的下一个值(一直往下,永远不回头,取下一个,指针在下一个值上面)

CURRVAL——返回序列的当前值(取当前的,指针永远在当前值上面)

 

示例1:

--查看序列的下一个值

SELECT seq_emp.NEXTVAL  FROM dual;

(显示的值1 2 3 4 5 ……,永远不会回头,不会显示相同的数字)

 

--查看序列的当前值

SELECT seq_emp.CURRVAL  FROM dual;

 

示例2:

--将序列的值插入到某表的某列中(标识列=序列+触发器)

INSERT  INTO  tb_name( tid,tname,tprice )  VALUES(
seq_emp.NEXTVAL, '张三', 100 );

INSERT  INTO  tb_name( tid,tname,tprice )  VALUES(
seq_emp.NEXTVAL, '李图', 90 );

3. 修改序列

ALTER  SEQUENCE  seq_emp

maxvalue 5000 cycle;

 

注意:

l 不能更改序列的start with参数

l 尽量不要修改,一旦修改会出问题,如果实在要改,先删了再创建序列。

4. 删除序列

DROP  SEQUENCE  seq_emp;

四、视图

通过定制的方式显示来自一个或多个表的数据。

视图就是一个虚拟表,就是一段查询的SQL语句。

创建视图所依据的表称为“基表”。

 

优点:安全性,降低了程序的复杂程度

1. 创建视图

基本语法:

CREATE  [OR REPLACE]  [FORCE]  VIEW  view_name [(alias[, alias]...)]

AS

select_statement

[WITH CHECK OPTION]

[WITH READ ONLY];

 

--FORCE表示强制创建视图,如果基表不存在会创建失败。使用FORCE则会在无基本的情况下创建一个失效的视图。

 

示例:

--查询emp表中每个员工的名字、薪水、奖金、收入、部门名称

CREATE  OR  REPLACE  VIEW  v_emps

AS

SELECT 姓名=a.ename,薪水=a.sal ,奖金=a.comm ,收入=(a.sal+nvl(a.comm,0)),部门=b.dname FROM emp a

INNER JOIN dept b

ON a.deptno=b.deptno;

 

注意:如果这时运行报错:没有权限,则要通过sys或system账户给scott赋view的权限。

GRANT  CREATE  VIEW  TO  scott;

2. 调用视图

SELECT  *  FROM  v_emps;

3. 删除视图

DROP  VIEW  v_emps;

 

 

思考 :

(1) 视图是否可以调用视图?

create or replace view v_empb as

select 姓名,薪水,奖金
from v_emps;

(2) 视图是否可以无限次嵌套?

SQL Server最多是32层,Oracle中应该也差不多

(3) 视图的数据是否可以直接修改?

视图的数据保存在表里,视图只是一张虚拟的表。

理论上来说是可以修改的,这个修改是在修改基表上的数据

五、索引

索引是数据库内部编排数据的一种方法。

优点:提高查询速度

1. 创建索引

CREATE  INDEX  索引名 ON  表名(列名,列名,……)

TABLESPACE 表空间名;

 

创建唯一索引:

CREATE  UNIQUE  INDEX  index_name  ON  TABLENAME(column_name);

 

创建组合索引:

CREATE  INDEX  index_name  ON  TABLENAME(column_name1,column_name2,……);

2. 重建索引(删除再创建)

ALTER  INDEX  索引名 REBUILD;

3. 修改索引

索引不能修改,要么重建索引,要么删除索引后再创建索引。

4. 删除索引

DROP  INDEX  索引名;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐