教你玩转oracle数据库-----------------管理数据库对象

一、表与用户的创建

1.1 创建表空间

root用户先登录,然后切换到oracle用户登录:
su - oracle
sqlplus / as sysdba //输入密码

创建表空间:
SQL> create tablespace school
datafile ‘/orc/app/oracle/oradata/school01.dbf’
size 100M;

//表空间名为school,大小100M

1.2 创建用户

SQL> create user c##jack
identified by abc123
default tablespace school
temporary tablespace temp
quota unlimited on school
password expire;

解析:
default tablespace school 创建表空间
temporary tablespace temp 定义临时表空间
quota unlimited on school 不设定配额

SQL> create user c##jack
2 identified by abc123
3 default tablespace school
4 temporary tablespace temp
5 quota unlimited on school
6 password expire;

create user c##jack
*
第 1 行出现错误:
ORA-65048: 在可插入数据库 ORCLPDB 中处理当前 DDL 语句时出错 ORA-00959: 表空间
‘SCHOOL’ 不存在

注意:这里出现报错,无法创建用户,这里和cdb有关,首先查询现在的session是cdb,这就导致了我在cdb创建了表空间但是pdb上面并没有这个表空间。由于cdb与pdb表空间结构不同,所以就出现了ora-00959的错误。

解决方法:
SQL> alter session set container=ORCLPDB;
会话已更改。
//从默认的ORCL改成了ORCLPDB,之后的创建表空间和用户就没有问题了,用户名前面也不需要加C##了。

创建用户:
SQL> create user jack
identified by abc123
default tablespace school
temporary tablespace temp
quota unlimited on school
password expire;

1.3 删除用户和表空间

SQL> drop user jack cascade;
SQL> drop tablespace school including contents and datafiles;

1.4 更改用户密码

SQL> alter user jack identified by jack123;

1.5 用户授权与撤权

注意:用户授权后才能用账号登录oracle数据库

SQL> grant connect,resource,dba to jack;
//授予连接和管理数据库权限,授权成功

登录:
SQL> sqlplus
jack
//成功

SQL> revoke connect,resource from jack;
//撤销成功

1.6 数据表

1.6.1 创建数据表

SQL> create table info(id number(4),name varchar2(10),score number(5,2),born date,address varchar2(50));

查看表结构:
SQL> desc info;
名称 是否为空? 类型


ID NUMBER(4)
NAME VARCHAR2(10)
SCORE NUMBER(5,2)
BORN DATE
ADDRESS VARCHAR2(50)

1.6.2 数据表中插入数据

SQL> insert into info values (1,‘zhangsan’,88,to_date(‘2020-10-23’,‘yyyy-mm-dd’),‘nanjing’);

查看表信息:
SQL> select * from info;
ID NAME SCORE BORN


  ADDRESS

     1 zhangsan                               88 23-10月-20

nanjing

SQL> commit;
//提交

向表中继续插入数据:
SQL> insert into info values (2,‘lisi’,77,null,null);

SQL> select * from info;
SQL> rollback;
//若回滚,可以回到创建zhangsan时,因为提交了创建zhangsan

SQL> select * from info;

    ID NAME                                SCORE BORN

ADDRESS

     1 zhangsan                               88 23-10月-20

nanjing

     2 lisi                                   77

SQL> set autocommit on;
//自动提交,回滚无效

二、索引

2.1 索引分类

B树索引
create index 索引名称 on 表名(列名)
SQL> create index index_info on info(score);

唯一索引、非唯一索引
create unique index 索引名称 on 表名(列名)
SQL> create unique index un_index_info on info(id);

反向索引
create index 索引名称 on 表名(列名) reverse

位图索引
create bitmap index 索引名称 on 表名(列名)
SQL> create bitmap index bt_index_info on info(address);

其他索引
create index 索引名称 on 表名(upper(列名))
//大写函数索引
SQL> create index up_index_info on info(upper(name));

2.2 查看索引

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

2.3 重建索引

alter index 索引名称 rebuild;
alter index 索引名称 rebuild tablespace 表空间

2.4 合并索引碎片

alter index 索引名称 coalesce;

2.5 删除索引

drop index 索引
SQL> drop index UP_INDEX_INFO;

三、视图

3.1 创建删除视图

创建视图:
SQL> create view view_info as select * from info;

查看视图:
SQL> select * from view_info;

删除视图:
SQL> drop view view_info;

3.2 物化视图

3.2.1 创建物化视图

通过jack演示,先赋权
SQL> conn system / abc123 as sysdba
SQL> show user;

SQL> grant create materialized view to jack;
SQL> grant query rewrite to jack;
SQL> grant create any table to jack;
SQL> grant select any table to jack;

创建物化视图日志:
conn jack / abc123
SQL> show user;
SQL> create materialized view log on dept with rowid;
SQL> create materialized view log on info;
//若失败
SQL> create table info1(id number(4) constraint PK_id primary key,name varchar2(10),score number(5,2));
SQL> create materialized view log on info1;

3.2.2 创建实体化视图

SQL> create materialized view mtrlview_info1 build immediate refresh fast on commit enable query rewrite as select * from info1;

3.2.3 删除物化视图

SQL> drop materialized view mtrlview_info1;

四、导入测试数据

su - root
mount.cifs //192.168.0.109/oracle /abc
//将真机中的脚本挂载到服务器/abc目录下:

su - oracle
sqlplus / as sysdba
//登录oracle数据库

SQL> select tablespace_name from dba_tablespaces;
//查看表空间

脚本存放位置:
/abc/text.sql

SQL> create user scott
identified by abc123
default tablespace users
temporary tablespace temp
quota unlimited on users;
//创建用户scott

SQL> grant connect,resource,dba to scott;
//授权成功,连接,操作数据库,dba权限

SQL> ho ls /abc/sql
//兼容Linux命令

SQL> conn scott/abc123
//切换用户scott

SQL> @/abc/text.sql
//导入脚本文件

SQL> select * from table;

五、序列

5.1 创建序列

SQL> create squence toy_info start with 1 increment by 1 maxvalue 2000 nocycle cache 30;
//start with 1:初始值
//increment by 1:增量
//maxvalue 2000:最大值
//nocycle:非循环

创建表:
SQL> create table info(
id number(4),
name varchar2(10),
score number(5,2));

插入数据:
SQL> insert into info values (toy_info.nextval,‘zhangsan’,88);
SQL> insert into info values (toy_info.nextval,‘lisi’,77);
toy_info后"."的意思:调用

查看序列:
SQL> select * from infol;

查看当前序列值:
SQL> select toy_info.currval from dual;

更改序列:
SQL> alter sequence toy_info maxvalue 5000 cycle;

删除序列:
SQL> drop sequence toy_info;

六、 同义词

同义词(别名)作用:
隐藏真实名称,保证数据安全性

分类:
公有:所有用户
私有:仅限于当前用户

6.1 私有同义词

SQL> create synonym pr_info for info;

仅限当前用户用此别名查询,其他用户不能用
SQL> select * from pr_info;

6.2 公有同义词

SQL> conn system/abc123 as sysdba

授权:
SQL> grant create public sysnonym to scott;

SQL> conn scott/abc123

创建公有同义词:
SQL> create public sysnonym pub_info for info;

切换其他用户也可以使用此命令
SQL> select * from pub_info;

七、分区表

作用:
解决海量数据存储问题,数据存在oracle的表空间中,表空间里有多个数据文件,海量数据分多个表空间中,查询数据时查询表空间。(根据时间分割)

创建表空间:
SQL> create tablespace tmp01 datafile ‘/orc/app/oracle/oradata/tmp01.dbf’ size 100M;
SQL> create tablespace tmp02 datafile ‘/orc/app/oracle/oradata/tmp02.dbf’ size 100M;
SQL> create tablespace tmp03 datafile ‘/orc/app/oracle/oradata/tmp03.dbf’ size 100M;
SQL> create tablespace tmp04 datafile ‘/orc/app/oracle/oradata/tmp04.dbf’ size 100M;

创建分区表:
SQL> create table sales (sale_id number(4),product_id varchar2(5),sale_date date)
partition by range (sale_date) (
partition p1 values less than (to_date(‘2020-07-25’,‘yyyy-mm-dd’)) tablespace tmp01,
partition p2 values less than (to_date(‘2020-08-25’,‘yyyy-mm-dd’)) tablespace tmp02,
partition p3 values less than (to_date(‘2020-09-25’,‘yyyy-mm-dd’)) tablespace tmp03,
partition p4 values less than (maxvalue) tablespace tmp04
);

插入数据到分区表中:
SQL> insert into sales values (1,‘abc’,to_date(‘2020-09-12’,‘yyyy-mm-dd’));

查询数据存在哪个分区表中:(在p3中)
select * from sales partition(p1);
未选定行

select * from sales partition(p2);
未选定行

select * from sales partition(p3);
SALE_ID PRODUCT_ID SALE_DATE


     1 abc             12-9月 -20

版权声明:本文为weixin_48191138原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。