

索引基础知识与建立单列,复合索引的方法,授于与收回用户登录,建表,建视图等系统权限及查询,修改,删除等对象权限的命令
一、索引的基础知识
1.查询一个表中拥有的索引:select index_name,index_type from user_indexes
2.索引的分类:除单列索引和复合索引外,还分B*树(建立在重复值很少的列),反向索引,位图索引(建立在重复值很的列),唯一索引和非唯一索引,函数索引,全局索引,分区索引
3.索引的优点:建立索引后,数据库对自动对其排序,查询的速度会大大加快
4.索引的缺点:要占用更多硬盘(为以前约1.2倍)和内存空间,数据库要分出额外时间更新索引,会导致对表的修改,删除,插入操作耗时更长。
5.不适合建索引的字段:一是逻辑性的字段,如男和女,二是很少去查询的字段
6.建立索引的要求:一是索引应建立在where子句或其它连接条件经常引用的字段的才建索引,一般大表建约引才有意义,二是索引的层次不要超过4层。
注:如果把字段约束设为unique(不允许重复),oracle会自动为该字段建立索引
二、单列索引与复合索引的建立方法
1.单列索引,对表的单个列建立索引。
create index nameindex on customer(name); //给上讲中的customer表的name字段创建名为nameindex的索引
2.复合索引,用以给需要经常联合查询的两个字段建立复合索引
select * from customer where name='sp' and catgory='aaa'; //如需要经常查询name和catgory字段
create index c_idx1 on customer(name,catgory);//给customer表的name和catgory两个字段建立名为c_idx1的复合索引
注:sql数据从后往前扫描,应把容易排除最多数据的字段放在后面
三、用户,方案,角色,系统权限,对象权限的基础知识
1.新建立的用户oracle会自动其创建一个和用户名称相同的方案,但新用户不属于任何角色,没有任何权限。(连登录数据权限都没有)
2.oracle的权限包括系统权限(如登录,建库,建表等)和对象权限(访问别的方案的数据对象的权限,主要有。。。)
3.角色是一些系统权限和对象权限的集合,用于批量给用户授于权限
4.使用sql语句查询常用的系统权限,见字典部分,部分系统权限列表见视频。。。。。查询(使用sql语句)oracle所有系统权限(约140多种
5.使用sql语句查询常用对象权限(alter ,delete ,select,insert,update,index,references,execute),对象权限,角色的方法请见字典部分
四、授予与收回用户的系统权限
1.给用户授予系统权限
注:要有dba权限的用户来才能授权,授权使用grant...to username关键字,如果要允许权限传递在最后加“with admin option”关键字
例:下面的例子是演示用system用户创建ken和tom两个用户,并给ken用户授于登录,建表,建视图权限,再用ken用户登录给tom用户授这些权限
conn system/manager as sysdba; //使用system用户登录
create user ken identified by m123; //创建名为ken的用户
create user tom identified by m123; //创建名为tom的用户
grant create session,create table to ken with admin option; //给ken用户授于登录和建表的权限,并允许该用户把授于的权限再授于他人
grant create view to ken; //给ken用户授于创建视图权限
conn ken/m123; //用ken用户登录
grant create session, create table to tom with admin option; //把登录会话与创建表的仅限再授于tom用户,并允许其把这些权授于他人
grant create view tom tom; //使用ken用户把创建视图的权限授于tom,但不能成功,因为system用户授于ken用户建视图权限时没有允许他授于他人
2.收回授于用户的系统权限
注1:要有dba权限或是授权的的用户才能收回其它用户的权限,使用“revoke....from username”关键字。
注:系统权限不是级联回收,如收收A用户的权限,不会同时收被A用户授于权限的其它用户。
例:下面例子是演示用system用户收回ken用户的权限后再查看被它授权的tom用户的权限是否也被收回
conn system/manager as sysdba;
revoke create session from ken;
conn tom/m123;
五、授于与收回用户的对象权限
1.授于用户一些基本的对象权限,如查询,删除,修改,所有等
注:sys,system可以将任何对象上的对象权限授于其它用户,用grant命令来完成
例:下面的例子是演示用system用户创建monkey用户并给它授于登录权限,再用scott用户给monkey用户授于查询,修改,删除emp表的权限,再用monkey用户登录查询是否有了这些权限
with grant option 不能授予角色
conn system/manager as sysdba; //使用system用户登录
create user monkey identified by m123; //创建monkey用户
grant create session to monkey; //给monkey用户授于连接会话,即登录的权限
conn scott/m123; //使用scott用户登录
grant select on emp to monkey; //给monkey用户授于查询其emp表的权限
grant update on emp to monkey;//给monkey用户授于修改其emp表的权限
grant delete on emp to monkey;给monkey用户授于删除其emp表的权限
grant all on emp to monkey;//给monkey用户授于其对emp表的所有权限
conn monkey/m123; //使用monkey用户登录
select * from scott.emp; //在monkey用户下查看scott用户的emp表,这里的scott表scott用户的方案
2.授予用户的列权限,
设置monkey用户只能修改emp表的sal字段:grant update on emp(sal) to monkey;
设置monkey用户只能查询emp表的ename和sal字段:grant select on emp(ename,sal) to monkey;
授予blake用户对scott用户的emp表有创建索引的权限,并允许它可以把这项权限传递给其它用户:grant index on scott.emp to blake with grant option; //创建索引的权限,并可往下传递
3.收回用户的对象权限
注:对象权限是级联回收,这点和系统权限回收是不同的,也就当一个用户的对象权限被收回后,它传递给权限的用户的权限也被收回了。
例:下面主要演示,当收回blake2用户的对象权限后,被它授于对象权限的jones2用户的对象权限也没有了
conn system/manager as sysdba; //使用有dba权限的用户登录
create user blake2 identified by m123; //创建一个名为blake2的用户
grant create session to blake2 with admin option; //给blake2用户授于登录数据库的权限
。。。。后面这句是例子grant select on scott.emp to blake2 with grant option; //本身在oracle9i下dba用户可以把某个用户的表授权给其它用户,但这里这句执行不成功,可能要10g才有这个功能
conn scott/m123; //用scott用户登录
grant select on emp to blake2 with grant option;//授于blake2用户有查询emp表的权限,并允许它再传递该权限给其它用户
conn system/manager as sysdba; //使用system用户登录
create user jones2 identified by m123; //创建名为jones2的用户
grant create session to jones2 with admin option;//授于jones2用户有登录数据库的权限,并允许传递该权限
conn blake2/m123; //使用blake2用户登录
grant select on scott.emp to jones2; //授于jones2用户查询scott.emp表的权限
conn jones2/m123; //使用jones2用户登录
select * from scott.emp; //查询scott.emp表
conn scott/m123; //使用scott用户登录
revoke select on emp from blake2; //收回blake2用户对emp表的查询权限
conn jones2/m123; //使用jones2用户登录
select * from scott.emp; //查询scott.emp表,因为是级联收回,所以这里是查不出来的