Oracle数据库对象---你diss了嘛

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介: Oracle数据库对象---你diss了嘛

Oracle中比较有特色的:同义词、序列

1.数据库对象

 又称模式对象,是逻辑结构的集合。

 最基本的数据库对象就是表。

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

   通俗点:就是把数据元素形象地进行了有规则排列,但不用考虑在计算机上如何实现。

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

 数据库对象包括:

 同义词、序列、视图、索引、表、函数、包、过程、触发器等。

2.同义词synonym

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

   (同义司对网管而言是个非常霸气的东西)

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

   如果只共享表空间中的某个表中的一部分数据,怎么共享?

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

   举例:

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

   同义词分类:

   1.私有同义词;--  只有自己使用; 只能在其模式内访问,且不能与当前模式的对象同名。

   2.公有同义词;--  搞个别名给大家使用;公有同义词可被所有的数据库用户访问。

   同义词作用

   1. 提高安全性
   2. 主要用于资源共享。

   

   模式==对象

1.私有同义词

 语法:

  Create [or replace]  Synonym  syn_emp  For  scott.emp;

   --Synonym   同义词

   --syn_emp   指scott.emp表的同义词(别名)

   --scott.emp 是模式名(对象名),其中emp是表名。

           如果当前是用scott账户在操作,则可以省略scott.

 

2.公有同义词

 语法:

  create public  synonym  syn_emp  for  scott.emp;

   --syn_emp  同义词名(别名)

注意:

 在创建私有同义词时,发现scott也没有权限创建,要让scott有创建的权限,就需要用管理员权限给scott授权。

 为某个账户授权同义词:

   grant create synonym to scott;

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

 取消授权:

   revoke create synonym from scott;

 以上是授权私有同义词,那么公有的同义词呢?

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

 

 

3.同义词的操作

调用:

   select * from syn_emp;

   --syn_emp 为同义词名(别名)

删除:

   Drop Synonym  syn_emp;        --删除私有同义词

   Drop Public Synonym  syn_emp;    --删除公有同义词

创建或替换(修改):

   create or replace sysnonym syn_emp for scott.emp;

三、序列

   oracle中没有标识列,就是序列,标识列可以做好多东西,有替代品---序列,比标识列麻烦的多。  序列+触发器

   什么是序列?

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

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

1,2,3,4,5,6,7,8

   序列有什么用?

   能为我们生成一组连续的,永远不重复的一组数字。

   主要用于提供主键值,做分页。

   序列就是我们所学的sql server中的标识列:

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

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

1.创建序列语法<色'昆死>

   create sequence 序列名称

       [start with 1]               -- (种子)从n开始计数

       [increment by 1]             -- (增量)每次递增n,负数为递减  <英'克瑞门特>

       [maxvalue n | nomaxvalue]    --  最大值

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

       [cycle | nocycle]             --  循环/不循环<塞叩>

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

--案例:    

create sequence seq_110

start with 1

increment by 1

maxvalue 99999

minvalue 1;

2.使用序列

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

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

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

id    1,2,3,6,4,5,

--案例:

   --查下一个(显示的值不会回头,没有回头的,有回头程序就有问题了)

   select seq_110.nextval from dual;

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

   --查当前

   select seq_110.currval from dual;

 

注意!!!:

1.序列不要轻易的删掉

 在SQL Server中,有标识列1,2,3,4的数据,如果删除标识列4的,再增加一条记录,标识列是5。

 在Oracle中,如为某表定义了序列,删除中间的某条记录,情况和SQL Server中一样,但是如果把该表的序列删掉,再创建序列,那么情况就不一样了。

学生信息表

 1,2,3,4,5 , 6, 7,8,9, 10, 11, 13 ,1 ,2 ,3

 序列,currval   nextval  13

  学号为7的学生成绩表  7,90  80

 1,2,3,4,5,6,7,8,9

 所以创建序列这里就不能用:create or replace sequence seq_110;

2.create sequence seq_110; 不写了,可不可以?结果会是什么?

 就是标识列,默认的属性,种子1,递增1,最大值?我也不知道,无聊你们自己去试。

 


   思考:

       既然序列是一组唯一、有序的数字,那在触发器insert时,把序列当做id插入,是否就可以达到了标识列的效果呢?

 

insert into tb_name(tid,tname,tprice)

  values(1,'张三',100);

insert into tb_name(tid,tname,tprice)

  values(2,'李四',100);

insert into tb_name(tid,tname,tprice)

  values(3,'李四',100);

insert into tb_name(tid,tname,tprice)

  values(4,'李四',100);

create sequence seq_110;  //创建一个序列

insert into tb_name(tid,tname,tprice)

  values(seq_110.nextval,'张三',100);  --序列当前值的下一个值

insert into tb_name(tid,tname,tprice)

  values(seq_110.nextval,'李国',100);

select seq_110.currval from dual;  --序列当前值

要搞清楚这个思路

   在往表里插入一条或多条数据时,会自动执行insert的触发器,

   那么我在编写insert触发器时,手动的将序列放入到触发器,

   每次执行插入一条数据时,添加了一个序列进去。

   不过有些麻烦,要在oracle中做成标识列,要触发器。

(每次插入时搞个触发器,然后在他插入之前,去修改一下他插入的那张临时表inserted,把表里的值就调用这个序列的nextval,这样看上去就看是个标识列。)

   比oracle要麻烦,要强大,有前触发,有后触发。

   思考:如果有100个表,要写多少个序列?1个还是100个?都行,没有标准的。

   如果写一个,100个表共用一个序列,那会造成每个表中的标识列不连贯,比如:

   A表:

   序列1,2,3,4,9,10,11,……

           1,2,3,4,5,6,7,8

   B表:

   序列5,6,7,8,12,13,14,……

        1,2,3,4,

  注意!!!:尽量做到一个表一个触发器一个序列。

   A表  seq_110

       序列1,2,3,5。。。。。。

   B表  seq_120

   序列1,2,3,4,5

4.更改和删除序列

   更改序列:

   alter sequence seq_110 maxvalue 5000 cycle;

   注意:不能更改序列的start with参数

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

   删除序列:

   drop sequence seq_110;


四、视图

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

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

   好处:安全性,降低了程序的复杂程度

--例如:emp查询每个员工的名字、薪水、奖金、收入、部门名称dept

--建议:先写查询语句,再去搞视图

--第1步写查询语句:

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;

是不是每个人都要写这么长段代码?不用,我们根据这需求创建个视图,以后别人要看,就直接调用这个视图名就行了。

--创建这个需求的视图

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;

--调用视图:

select * from v_emps;

思考:

--1. 视图是否可以调用视图?(肯定)

--案例:我现在只要姓名,薪水,奖金3个列

create or replace view v_empb

as

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

--2. 视图是否可以无限次嵌套?(应该不行,SQL Server最多是32层,Oracle中应该也差不多)

--3. 视图的数据是否可以直接修改?(视图的数据保存在表里,视图只是一张虚拟的表)

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

   但有一种合成、聚合的数据,比如“收入”是由薪水+奖金,是不能被修改的。

-------联接视图(要操作)

关于+的,+号在右--->左联 left outer join

       +号在左--->右联 right outer join

       左右都有+号--->全联  full outer join

-------视图上的DML语句

-------视图中的函数


五、索引

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

  优点:提高查询速度

--创建索引

Create Index index_name on Tablename(colname,colname...)

tablespace 表空间名;

   --不能使用or replace

--重建索引(修改)

Alter Index index_name Rebuild;

--删除索引

Drop Index index_name;

--唯一索引

Create Unique Index index_name On Tablename(colname);

--组合索引

create index index_name on tablename(colname1,colname2,……);

--反向键索引

--位图索引

--索引组织表

 好处:把数据存储在与其关联的索引中

 最大优点:访问数据都是基于组件
 就是教大家创建表

 


相关文章
|
2月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
297 93
|
25天前
|
Oracle 关系型数据库 Linux
【赵渝强老师】使用NetManager创建Oracle数据库的监听器
Oracle NetManager是数据库网络配置工具,用于创建监听器、配置服务命名与网络连接,支持多数据库共享监听,确保客户端与服务器通信顺畅。
129 0
|
2月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
237 8
|
4月前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL中的数据库对象
本教程详细介绍了MySQL数据库中的常见对象,包括表、索引、视图、事件、存储过程和存储函数的创建与管理。内容涵盖表的基本操作、索引的使用、视图简化查询、事件调度功能等,并通过具体示例演示相关SQL语句的使用方法。
|
4月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—服务器异常断电导致Oracle数据库报错的数据恢复案例
Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库没有备份,仅有一些断断续续的归档日志。 Oracle数据库恢复流程: 1、检测数据库故障情况; 2、尝试挂起并修复数据库; 3、解析数据库文件; 4、导出并验证恢复的数据库文件。
|
SQL Oracle 关系型数据库
Oracle 无效对象查询,编译无效对象
编译无效对象 有两种方式: 1、执行sql查询结果 2、脚本编译
|
SQL Oracle 关系型数据库
|
SQL Oracle 关系型数据库
oracle 编译无效对象
1.手动编译 如果无效对象的数量很少,那么你可以逐个编译这些对象. 如 ALTER PACKAGE my_package COMPILE; ALTER PACKAGE my_package COMPILE BODY; ALTER PROCED...
1629 0
|
4月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。

热门文章

最新文章

推荐镜像

更多