oracle事物和常用数据库对象笔记和实验

Posted on 2020-06-16 19:58  留不住的时间  阅读(238)  评论(0编辑  收藏  举报

一:事物
1:什么是事物
是业务上的一个逻辑单元,它能够保证其中对数据所有的操作,要么全部成功,要么全部失败

2:事物的特性
原子性、一致性、隔离性、持久性

3:事物的控制
使用COMMIT和ROLLBACK实现事务控制
    COMMIT:提交事务,即把事务中对数据库的修改进行永久保存
    ROLLBACK:回滚事务,即取消对数据库所做的任何修改

使用AUTOCOMMIT实现事务的自动提交
    设置AUTOCOMMIT为ON

二:索引
1:索引的含义
索引是oracel的一个对象,是与表关联的可选结构,提供了一种快速访问数据的途径,提高了数据库检索性能

2:索引的特性
提高查询速度
可以对表的一列或多列建立索引
建立索引的数量没有限制
索引需要磁盘存储
索引的引用由oracle决定

3:索引的分类
B树索引
唯一索引和非唯一索引
反向键索引
位图索引
组合索引
基于函数的索引

三:视图
1:视图的含义
视图:视图是一个虚表,不占用物理空间,视图中的数据是从一个或多个实际表中获得的。
物化视图:物化视图也称为实体化视图,含有数据,占用空间。

2:视图的作用
提供了另外一种级别的表安全性
隐藏的数据的复杂性
简化的用户的SQL命令
隔离基表结构的改变
通过重命名列,从另一个角度提供数据


四:序列
1:序列的含义
序列是用于生成一系列唯一数字的对象,通常用来自动生成主键或唯一键的值。

2:访问序列
NEXTVAL 返回序列的下一个值
CURRVAL 返回序列的当前值

五:同义词
1:同义词含义
同义词是现有对象的一个别名

2:同义词的好处
简化SQL语句
隐藏对象的名称和所有者
提供对对象的公共访问

3:同义词的类型
私有同义词:只能在其模式内访问,且不能与当前模式的对象同名
公有同义词:可被所有的数据库用户访问

六:分区表
1:分区表的含义
允许用户将一个表分成多个分区,这个分划分过区的表就是oracle的分区表

2:分区表的特性
用户可以执行查询,只访问表中的特定分区
将不同的分区存储在不同的磁盘,提高访问性能和安全性
可以独立地备份和恢复每个分区

3:分区表优点
改善表的查询性能
表更容易管理
便于备份和恢复
提高数据安全性


4:分区表的条件
数据量大于2GB
已有的数据和新添加的数据有明显的界限划分

实验部分:

添加c##scott账号,为后续试验做准备

1sys身份登录oracle

2:创建测试账号scott

SQL> create user c##scott identified by scott default tablespace users temporary tablespace temp quota unlimited on users;

 

3:授权

SQL> grant connect,resource to c##scott;

 

4:导入脚本文件(提前将脚本拷贝到/opt的目录下)

SQL> @/opt/test.sql

 

5:切换到c##scott用户

SQL> conn c##scott/scott

 

一:事务

1:使用commitrollback实现事务控制

 

1):向scott数据库中的dept表插入数据

SQL> conn c##scott

SQL> col loc for a10;

SQL> select * from dept;

 

    DEPTNO DNAME       LOC

---------- ------------------------------------------ ----------

10 ACCOUNTING       NEW YORK

20 RESEARCH       DALLAS

30 SALES       CHICAGO

40 OPERATIONS       BOSTON

 

SQL> insert into dept values(50,'a',null);

SQL> insert into dept values(60,'b',null);

SQL> commit;

SQL> select * from dept;

 

2):再次插入数据,不提交,执行回滚操作

SQL> insert into dept values(70,'c',null);

SQL> select * from dept;

SQL> rollback;

SQL> select * from dept;

 

2:实现事物的自动提交

SQL> set autocommit on;       \\实现事物自动提交

SQL> insert into dept values(90,'b',null);

SQL> rollback;

SQL> select * from dept;

 

 

二:索引

1:索引的创建

SQL> conn c##scott

 

1)创建B树索引

SQL> create index emp_ename_idx on emp(ename);   \\emp表中,为雇员名称列创建B树索引

 

2)创建唯一索引

SQL> create unique index emp_grade_unique_idx on salgrade(grade);  \\salgrade表中,为级别编号grade创建唯一索引

 

3)反向键索引

emp中,为雇员编号empno创建反向键索引

SQL> create index emp_deptno_reverse_idx on emp(deptno) reverse;

 

4)位图索引

SQL> create bitmap index emp_job_bit_idx on emp(job);  \\为工种列创建位图索引

 

5)基于函数的索引

SQL> create index emp_ename_upper_idx on emp(upper(ename));  \\为雇员名称创建大写函数索引

 

2:查看索引

1)查看索引名,索引类型,所属表名,表空间名称

SQL> SQL> select index_name,index_type,table_name,tablespace_name from user_indexes;

 

2)查看索引名,表名,索引列

SQL> select index_name,table_name,column_name

from user_ind_columns

where index_name like 'EMP%';

 

3:维护索引

1): SQL> alter index emp_job_bit_idx rebuild;  \\重建索引

2): SQL> alter index emp_job_bit_idx coalesce;  \\合并索引碎片

3): SQL> drop index emp_job_bit_idx;  \\删除索引

 

 

三:视图

普通视图

1:创建视图

1)创建表

[oracle@oracle admin]$ sqlplus sys/aptech as sysdba

SQL> create table order_master (

orderno number(5) constraint p_ord primary key,

odate date,

vencode number(5),            

o_status char(1));

 

2插入数据

SQL> insert into order_master values (1,to_date('2006-01-01','yyyy-mm-dd'),1,'a');

SQL> insert into order_master values (2,to_date('2007-01-01','yyyy-mm-dd'),2,'p');

 

3)创建视图

SQL> create view pen_view as

  select * from order_master

  where o_status ='p';        \\该列作为创建视图的条件,不能被修改

 

4)查询视图

SQL> select * from pen_view;

 

2:由于视图创建有缺陷,导致错误的修改后,无法查询视图,可以为视图添加约束,

1通过视图修改数据(错误的修改后,无法查询视图,修改了o_status列的值

SQL> update pen_view set o_status='d' where o_status='p';

SQL> select * from pen_view;

 

2为了避免修改视图错误,使用with check option创建检查约束

SQL> create or replace view pen_view as select * from order_master where o_status='p'

with check option constraint penv;

 

3)插入数据

SQL> insert into order_master values (3,to_date('2007-01-01','yyyy-mm-dd'),3,'p');   \\插入数据

 

4)修改视图,会报错,因为违反检查约束

SQL> update pen_view set o_status='d' where o_status='p';

 

3:使用read only创建只读视图,阻止对视图的修改

SQL> create or replace view pen_view as select * from order_master with read only;

 

4:创建视图时,基表不存在

1)创建错误的视图(venmaster表不存在)

SQL> create force view ven as select * from venmast;

会报错,提示表不存在,此时可以创建出这个表,如果针对该表执行了sql语句,系统会自动重新编译该视图,也可以手动重新编译此视图

 

2)创建venmast

SQL> create table venmast (

venno number(5) constraint p_ven primary key,

vendate date,

vencode number(5),            

ven_status char(1));

 

3)手动编译视图,

SQL> alter view ven compile;

 

4:创建带有order by字句的视图

SQL> create or replace view pen_view as select * from order_master order by orderno;

 

5DML语句和复杂视图

1)通过数据字典查询视图

SQL> select view_name from user_views;

 

2)删除视图

SQL> drop view pen_view;

 

物化视图

1:查看物化视图的查询重写功能是否开启

SQL> show parameter query_rewrite_enabled;

 

2:创建物化视图

1)位c##scott账户授权

SQL> conn system   \\先以system的身份链接oracle

SQL> grant create view to c##scott;   \\赋予scott创建视图的权限

SQL> grant create materialized view to c##scott;   \\赋予scott创建物化视图的权限

SQL> grant query rewrite to c##scott;   \\赋予scottquery rewrite的权限

SQL> grant create any table to c##scott;   \\赋予scott创建表的权限

SQL> grant select any table to c##scott;   \\ 赋予scott查询任何表的权限 

 

2)创建物化视图日志

SQL> conn c##scott   \\scott账户登录

创建物化视图日志

SQL> create materialized view log on dept with rowid;

SQL> create materialized view log on emp with rowid;

 

3创建物化视图

SQL> create materialized view mtrlview_test

build immediate

refresh fast

on commit

enable query rewrite

as

select d.dname,d.loc,e.ename,e.job,e.mgr,

e.hiredate,e.sal,d.rowid d_rowid,e.rowid e_rowid

from dept d,emp e

where d.deptno=e.deptno;

 

4)删除物化视图

SQL> drop materialized view mtrlview_test;

 

 

四:序列

1:创建序列

SQL> create sequence toy_seq

  start with 10

  increment by 1

  maxvalue 2000

  nocycle

  cache 30;

 

2:序列的使用

1)创建表

SQL> create table toys (

  toyid number not null,

  toyname varchar2(20),

  toyprice number);

 

2)插入数据

SQL> insert into toys (toyid,toyname,toyprice)

  values (toy_seq.nextval,'twenty',25);

 

3)查看数据

SQL> col toyname for a10;

SQL> select * from toys;

 

4)查看序列当前值,和下一个值

SQL> select toy_seq.currval from dual;

SQL> select toy_seq.nextval from dual;

 

3:更改序列

SQL> alter sequence toy_seq

  maxvalue 5000

  cycle;

 

4:查看序列

SQL> select sequence_name,increment_by,cache_size

  from user_sequences;

 

5:删除序列

SQL> drop sequence toy_seq;

 

五:同义词

1:在system模式下创建私有同义词访问scott模式下的emp

1)以system身份登陆,并查询scottemp

SQL> conn system

SQL> select * from c##scott.emp ;

 

2)创建同义词emp

SQL> create synonym sy_emp for c##scott.emp;

 

3)访问同义词sy_emp

SQL> select * from sy_emp;

 

2:案例:访问网络服务名为orcl的远程数据库中的表T

1system身份登录

SQL> conn system/aptech@orcl

 

2)下面语句是要创建一个表T,并添加两条记录(书上没有这个过程,表T也就不存在了,所以要创建一个表T

SQL> create table T (

   orderno number(5) constraint p_ord primary key,

   odate date,

   vencode number(5),            

   o_status char(1));

 

3)添加数据

SQL> insert into T values (1,to_date('2006-01-01','yyyy-mm-dd'),1,'a');

SQL> insert into T values (2,to_date('2007-01-01','yyyy-mm-dd'),2,'p');

 

4)创建数据库链接

SQL> create database link dblink_sw_orcl connect to system identified by aptech using 'orcl ';

 

5)用刚创建的链接名查询

SQL> select * from T@dblink_sw_orcl;

 

6)创建私有同义词,orcl为实例名

SQL> create synonym sy_T for T@orcl;

 

7)用私有同义词查询

SQL> select * from sy_T;

 

3:在scott模式下对部门表dept创建共有同义词public_sy_dept,让其他用户也能使用这个共有同义词

SQL> conn system

SQL> create user c##user1 identified by aptech;

SQL> grant connect,resource to c##user1;

SQL> grant create public synonym to c##scott;

SQL> conn c##scott

SQL> grant select on dept to c##user1;

SQL> create public synonym public_sy_dept for dept;

SQL> conn c##user1

SQL> select * from public_sy_dept;

 

4:删除同义词

SQL> drop synonym system.sy_emp;

SQL> drop public synonym public_sy_dept;

 

六:分区表

1:以分区的方式建立季度销售信息

SQL> conn sys as sysdba

 

create table sales

(

sales_id number,

product_id varchar2(5),

sales_date date not null

)

partition by range (sales_date)

(

partition p1 values less than (to_date('2013-04-1','yyyy-mm-dd')),

partition p2 values less than (to_date('2013-07-1','yyyy-mm-dd')),

partition p3 values less than (to_date('2013-10-1','yyyy-mm-dd')),

partition p4 values less than (to_date('2014-01-1','yyyy-mm-dd')),

partition p5 values less than (maxvalue)

);

 

2:插入数据

SQL> alter session set nls_date_format = 'yy-mm-dd';       \\设置日期格式

SQL> INSERT INTO SALES VALUES (1,'P001','2013-02-3');

 

3:查看某季度的数据

SQL> select * from sales partition(p1);

 

4:删除某季度的数据(如果表中无数据会提示0 rows deleted.

SQL> delete from sales partition(p1);

 

5:查看分区情况

SQL> select * from user_tab_partitions;