oracle学习笔记3(一)

2014-11-24 17:04:37 · 作者: · 浏览: 2
//数据完整性,商业和逻辑规则,可以使用约束、触发器和应用程序(过程和函数)三种方法来实现
//约束包括 not null,unique, primary key, foreign key, 和 check 五种
//一个表可以有多个unique,但是只能有一个primary key

//商品表, 商品编号为主键,单价大于0,
create table goods(goodId, char(8) primary key,goodsName varchar2(30), unitprice number(10,2) check(unitprice>0),
category varchar(8),provider varchar(20));
//客户表,
create table customer(customerId char(8) primary key,name varchar2(50) not null --不为空,address varchar2(50),
email varchar2(50) unique --email地址唯一,
sex char(2) default '男' check(sex in('男','女'))--默认为男,不是男就是女
cardId char(18));
//购买表
create table purchase(customerId char(8) references customer(customerId)--外键指向customerId
goodId char(8) references goods(goodId)--外键
nums number(5) check(nums between 1 and 30));

//增加not null约束必须使用modify, 其他使用add
alter table goods modify goodsName not null; //更新goods表的goodsName字段不为空
alter table customer add constraint cardUnique unique(cardId)//增加身份证不允许重复,cardUnique是约束的名字
alter table customer add constraint addressConstrian check(address in ('海淀', '朝阳', '通州'));//增加客户的住址,必须是'海淀' '朝阳' '通州',addressConstrian是约束名字
alter table 表名 drop constraint 约束名称; //删除约束
//删除主键的约束有可能导致错误,所以带上必须cascade选项

//显示约束信息
select * from user_constraints where table_name='表名';
select * from user_cons_columns where constraint_name='约束名'; //显示约束列

//列级定义,定义列的同时定义约束
//表级定义,定义了所有列之后,再定义约束,注意not null只能是列级定义
create table xxx(empId number(2), name varchar2(15), dept_id number(2), constraint pk_employee primary key empId,
constraint fk_department foreign key (dept_id) references department(dept_id)); //表级定义

//索引
//单列索引
create index nameIndex on customer(name); //在customer表的name字段上建立索引
//复合索引
create index nameSexIndex on customer(sex,name); //在name和sex上建立复合索引,sex的索引更有效,所以写在前面

//原则 1、在大表上 2、使用where语句的查询较多的列 3、索引层次不超过4层,多级索引
//缺点 1、1.2倍的硬盘和内存空间 2、更新数据时额外的系统时间更新索引,维护数据和索引的一致性,不恰当的索引会降低系统性能
不要建索引的情况:很少或不常用的字段,逻辑性的字段,比如sex,'男''女'

//显示表的所有索引
dba_indexs 显示 数据库的所有索引信息
user_indexs 显示当前用户的所有索引信息
select * from
//如果字段是unique,自动增加索引

//权限,
// 系统权限(针对数据库),system_privilege_map (create table\conn\)
//对象权限(select\alter\delete\update\insert\references\execute)
//角色,是为了简化权限的管理
select * from dba_roles;
//授予系统权限 dba用户或者是带有grant any privilege权限,选项with admin option可以把权限赋值给别的用户
//创建ken和tom用户
create user ken identified by m123;
create user tom identified by m123;
grant ken create session, create table to ken with admin option;
grant create view to ken;
grant create session, create table to tom with admin option; //用ken用户给tom用户赋权
//回收系统权限,一般是dba用户完成,或者拥有相应的系统权限及转系统权限的选项with admin option
revoke create session from ken; //回收ken的登陆权限,但是tom依然能登陆,证明系统级联权限不会回收
//授予对象权限,dba用户或者是拥有with grant option 权限,此权限可以赋值给用户,但不能赋给role
grant select on emp to monkey; //scott用户把emp表的查询权限赋值给monkey用户
grant update on emp(ename,sal) to monkey; //monkey用户只能访问emp表的ename和sal两列
授予alter/index/execute权限
选项with grant option 代表可以把权限传递给别的人,该选项只能赋值给用户,但不能赋值给role
对象权限(with grant option)的级联赋值后,第一个用户的权限被rovoke后,其他用户的对象权限也会被回收

//角色 就是相关权限的命令的集合(预定义和自定义)
常用的预定义角色:connect、resource、dba
connect角色(create session ,create cluster, alter session, create database link, create sequence,create table,create view)
resource角色()
dba角色()没有启动和关闭数据库的权限

//自定义角色,一般是dba来创建,或者拥有create role的系统权限
不验证 create role 角色名not identified;
验证 create r