oracleday14(索引 管理权限和角色 系统权限 对象权限 SQLhelper补充)

在sql server 和 mysql 中都是可以在定义表的时候 直接指定自增长

sql server  oracle 效率比较高 设置严密

create table temp1(

id int primary key identity(1,1),

name varchar(36));

)


mysql 

create table temp19

Id int primary key auto_increment,

name varchar(36);


)


为什么需要索引 数据库中内容 太多 如果没索引 每个遍历过去 巨慢

索引 可以通过哈希算法 分配位置 检索快

如何创建索引


索引的分类  索引名不能重复

1、单列索引

create index 索引名 on 表名(列名);

2、复合索引

create index 索引名 on 表名(列名.列名2);


create table user(name varchar2(32),age number, email varchar2(32));

create index inx_name on user(name);


使用原则

1、在大表上建立索引才有意义(数据量太少没什么意义  4本书建个小箱子 也浪费资源)

2、在where子句或是连接条件上经常引用的列上建立索引

select * from where 列名='条件值'; (经常用 数据库还要维护)

 3、索引的层次不要超过4层(操作系统相关 查找超过4层没什么意义还麻烦)


索引的先天不足

1、建立索引 系统要占大约为表的1.2倍的硬盘和内存空间来保存索引

2、更新数据的时候 系统必须要有额外的时间来对索引进行更新 以维持数据和索引的一致性 实践表明  不恰当的索引不但于事无补反而会降低系统性能 

因为大量的索引在进行插入、修改和删除操作时比没有索引花费更多的系统时间


比如在如下字段建立索引应该是不恰当的

1、很少或从不引用的字段

2、逻辑型的字段 如男或女(是或否) 等 综上所属 提高查询效率是以消耗一定的系统资源为代价的 索引不能盲目建立 

这是考验一个DBA是否优秀的很重要的指标


索引的缺点

建立索引会增加表的1.2倍

索引会影响数据插入删除修改的效率


按照数据库存储方式 可以分为 B树 反向索引 位图索引

按照索引列的个数 可以分为 单列索引 复合索引

按照索引列值的 唯一性 可以为分唯一索引 和非唯一索引

此外还有函数索引 全局索引 分区索引


管理权限和角色

当刚刚建立用户的 用户没有任何权限 也不能执行任何操作 如果要执行某种特定的数据库操作 则必须为其授予系统的权限 如果用户要访问 其他方案的对象 

则必须为其授予系统的权限 如果用户要访问其他方案的对象 则必须为其授予对象的权限 为了简化权限的管理 可以使用角色 


权限 权限是指执行特定类型sql命令或是访问其他方案对象的权力 包括系统权限和对象权限两种

系统权限 有166中系统权限  主要是指对数据库管理的操作 以及对数据对象的操作 (创建,删除, 修改) 数据对象本身的操作

系统权限是指执行特定类型sql命令的权力 它用于控制用户可以执行的一个或是多组数据库操作 比如当用户具有create table 权限时 可以在其方案中建表

当用户具有create any table 权限时 可以在任何方案中建表 常用的权限 

create session 连接数据库  create table 建表 create view 建视图 create public synonym 建同义词

create procedure 建过程、函数、包 create trigger 建触发器 create cluster 建簇


可以通过查询数据字典视图system_privilege_map 可以显示所有系统权限

select * from system_privilege_map order by name ;


授予系统权限

一般情况 授予系统权限是由dba完成的 如果用其他用户来授予系统权限 则要求用户必须具有grant  any privilege 的系统权限在授予系统权限时

可以带有with admin privilege 选项 这样被授予权限的用户或是角色还可以将系统权限 授予其他的用户或是角色 


创建两个用户 并指定密码

create user ken identified by m123;

create user ken identified by m123;

给用户授权

授予 create session 和create table 权限 带with admin option

grant 权限名称 to 用户名

grant create session to ken with admin option; [带with admin option 就表示ken 可以把他得到的两个权限 继续向别的用户转发]

grant create table to ken with admin option; 

回收系统权限

使用system 回收 ken (create session 权限)

基本语法

revoke 权限名称 from 用户名

revoke create session from ken;

一般情况下 回收系统权限是由dba 来完成 如果其他的用户来回收系统权限 要求该用户必须具有相应系统权限及转授系统权限的选项(with admin option)

回收系统权限使用revoke 来完成 但是系统权限级联收回问题 不是级联回收  就是说 之前被系统授予权限的人授予权限给别人的权限不会被回收

就是 老大被干掉小弟还有权利



对象权限 对数据对象的操作 (select insert delete update) 针对数据

对象权限指访问其他方案对象的权利 用户可以直接访问自己方案的对象但是如果要访问别的方案的对象 则必须具有对象的权限 

比如smith用户要访问scott.emp表(scott:方案,emp:表)

则必须在scott.emp表上具有对象的权限 常用的有

alter 修改 delete 删除 select 查询 insert 添加 update 添加 index 索性 references 引用 execute 执行

查看所有对象权限 由dba 管理  需要(dba角色)可以用system用户看  select distinct privilege from dba_tab_privs;

搜于对象权限 在 oracle9i 前授予对象权限是由对象的所有者来完成的 如果用其他用户来操作 则需要用户具有相应的(with grant option)

权限 从oracle9i开始 sys system 可以将任何对象上的对象权限授予其他用户 授予对象权限是用grant 命令来完成的

grant 对象权限 on 数据库对象 to 用户名[,用户名] [with grant option]

oracleday14(索引 管理权限和角色 系统权限 对象权限 SQLhelper补充)



角色  本质多个权限的集合 为了简化对权限的管理 

预定义角色 

自定义角色

public static void executeUpdaet2(String[] sql,String[][] parameters){
try {
ct = DriverManager.getConnection(url,username,password);//获取连接要写url和username和password
ct.setAutoCommit(false);//先得到连接再设不然会报空指针


//循环的对sql数组进行创建
//根据parameters[][]设置
//执行executeUpdate();
//ct.commit();
if(parameters!=null){
for (int i = 0; i < parameters.length; i++) {
ps = ct.prepareStatement(sql[i]);
for (int j = 0; j < parameters[i].length; j++) {


ps.setString(i+1, parameters[i][j]);
}
}
ps.executeUpdate();
}
//执行
} catch (SQLException e) {


e.printStackTrace();
throw new RuntimeException(e.getMessage());
}finally{
close(rs,ps,ct);
}
}

public static void executeUpdate3(String[] sql, String pr[][]) {
try {
ct = DriverManager.getConnection(url, username, password);
ct.setAutoCommit(false);
if (pr != null) {
for (int i = 0; i < sql.length; i++) {
// 有一个sql就创建一个prepareStatement
ps = ct.prepareStatement(sql[i]);


for (int j = 0; j < pr[i].length; j++) {
ps.setString(j + 1, pr[i][j]);
}
// 把ps保存到Vector向量 考虑到多线程并发 用Vector更安全
vector.add(ps);
}
ps.executeUpdate();
}
ct.commit();
} catch (SQLException e) {


e.printStackTrace();
} finally {
close(rs, ps, ct);
}


}