用户
预定义帐户:
- SYS 和SYSTEM
- 授予了DBA 角色
- 执行启动、关闭和某些维护命令时需要使用的帐户
- 必需存在的帐户,不能删除
创建用户的步骤
- 确定用户用于存放对象的表空间
- 确定每个表空间的配额
- 指定默认表空间和临时表空间
- 创建用户
- 为用户分配权限和角色
每一个数据库用户帐户包括:
• 唯一的用户名:不能超过30 个字节,以字母开头
• 验证方法:最常见的验证方法是口令
• 默认表空间:如果用户未指定其它表空间,则可在这个表空间中创建对象。请注意,具有默认表空间并不意味着用户具有在该表空间创建对象的权限,也不意味着用户具有该表空间(用于创建对象)中的空间限额。这两项需要另外单独授权。
• 临时表空间
• 用户概要文件:profile,分配给用户的一组资源与口令的限制
• 使用者组
• 锁定状态:用户只可访问“未锁定”帐户 • SYS 帐户:
– 授予了DBA 角色,必须使用AS SYSDBA 子句
– 具有ADMIN OPTION 的所有权限
– 执行启动、关闭和某些维护命令时需要使用的帐户
– 拥有数据字典
– 拥有自动工作量资料档案库(AWR)
– 只有授予了SYSDBA 或SYSOPER 权限的“授权”用户才可以启动或关闭数据库实例
• SYSTEM 帐户授予了DBA 角色,而不是SYSDBA 权限。
• 这两个帐户不在例行程序操作中使用。
• SYS 和SYSTEM 帐户是数据库中必需存在的帐户,不能将其删除。
创建用户
CREATE USER andy
IDENTIFIED BY andy
DEFAULT TABLESPACE data
TEMPORARY TABLESPACE temp
QUOTA 15M ON data
QUOTA 10M ON users;
删除用户
DROP USER andy;
DROP USER andy CASCADE;
如果方案中包含了对象,使用CASCADE子句删除方案中包含的所有对象
当前连接在Oracle服务器上的用户不能被删除
重置口令
ALTER USER andy identified by andy#2017;
指定默认用户表空间和临时表空间
ALTER USER andy default tablespace USER temporary tablespace TEMP;
查询用户信息
SQL> SELECT username, default_tablespace 2 FROM dba_users;
权限
用户权限有两类
- 系统: 使用户在数据库中能够执行特定的任务
- 对象: 使用户可以访问和操作特定的对象
权限的信息可以通过查询下面的数据字典得到:
- DBA_SYS_PRIVS 授予用户和角色的系统权限
- SESSION_PRIVS 用户当前可用的权限
- DBA_TAB_PRIVS 数据库对象的赋权
- DBA_COL_PRIVS 对象列的赋权
系统权限
允许用户在数据库中执行特定的操作 ( SQL 语句)
有超过100个不同的系统权限
GRANT和REVOKE命令
分类
- 系统范围操作
CREATE SESSION, CREATE TABLESPACE - 在用户方案内的对象管理
CREATE TABLE - 在任意方案中的对象管理
CREATE ANY TABLE
SYSDBA和SYSOPER权限
只有数据库管理员才具有连接到具有管理员特权的数据库的能力。以 SYSDBA 身份连接为用户提供了对数据库或数据库中的对象执行任何操作的不受限制的权限。
授予系统权限
- 使用 GRANT 命令授予系统权限
- 使用 ADMIN 选项可以将授予能力进一步传递下去(将系统权限继续授予其它用户)
GRANT CREATE SESSION TO emi;
GRANT CREATE SESSION TO emi WITH ADMIN OPTION;
移除系统权限
- 使用 REVOKE 命令从用户上去除系统权限
- 只有用 GRANT 命令授予的权限可以被移除
REVOKE CREATE TABLE FROM emi;
移除具有 ADMIN OPTION选项的系统权限
对象权限
允许用户访问和操纵特定的对象(如表、视图、序列、过程、函数或程序包)
在没有特定权限的情况下,用户只能访问他们自己拥有的对象
授予对象权限
- 使用 GRANT 命令授予对象权限
- 授予者必须是对象的拥有者或者具有GRANT OPTION选项的用户
移除对象权限
- 使用 REVOKE 命令移除对象权限
- 移除对象权限的用户必须是要移除对象权限的对象的拥有者
角色
角色是可授予用户或其它角色的、由相关权限组成的一些命名组。
- 将权限分配给角色
- 将角色分配给用户
预定义角色
• 简化权限管理:使用角色可简化权限管理。可以将一些权限授予某个角色,然后将该角色授予每个用户,而不是将同一组权限授予多个用户。
• 动态进行权限管理:如果修改了与某个角色关联的权限,则授予该角色的所有用户都会立即自动获得修改过的权限。
• 有选择地使用权限:通过启用或禁用角色可以暂时打开或关闭权限。启用角色还可以用来验证用户是否已授予该角色。
方案
方案是指由特定用户拥有的数据库对象的集合
方案的名称与拥有该方案的用户的名称相同
方案对象是指直接引用数据库数据的逻辑结构
方案对象包含诸如表、视图和索引等多种结构
方案不一定要直接与单个表空间相关
一个方案中的对象可以保存在不同的表空间中
一个表空间也可以保存不同方案中的对象
创建数据库时,系统会创建多个方案
SYS 方案:包含数据字典
SYSTEM 方案:包含存储管理信息的附加表和视图
表
创建表
CREATE TABLE userabc.employees(
employee_id NUMBER(6),
first_name VARCHAR2(20),
last_name VARCHAR2(25),
email VARCHAR2(25),
phone_number VARCHAR2(20),
hire_date DATE DEFAULT SYSDATE,
job_id VARCHAR2(10),
department_id NUMBER(4))
TABLESPACE USERS;
删除表
DROP TABLE [schema.] table [CASCADE CONSTRAINTS] [PURGE]
截断表
TRUNCATE TABLE [schema.] table [{DROP | REUSE} STORAGE]
删除一个表将会删除:
- 数据
- 表结构
- 数据库触发器
- 相应的索引
- 关联的对象权限
DROP TABLE 语句的可选子句:
CASCADE CONSTRAINTS:删除所有相关的引用完整性约束条件
PURGE:无法闪回
如果不使用PURGE 子句,则表定义、关联索引和触发器会被放置在回收站中
表及表索引所占用的空间仍会计入用户在有关表空间中的可用限额之内
PURGE RECYCLEBIN 命令可用于清空回收站
截断表会使表的行数据不可用,而且可选择释放占用空间。
使用此命令会产生以下影响:
- 通过将高水位标记(HWM) 设置到表开头,将表标记为空,从而使表行不可用。
- 由于TRUNCATE TABLE 是DDL 命令,因此不会生成还原数据,而且会隐式提交命令。
- 还会截断相应的索引。
- 不会截断外键引用的表。
- 使用此命令时不会触发删除触发器。
- 要删除所有表行,这种方式通常比发出DELETE 语句的速度要快很多倍,原因如下:
- Oracle 数据库重置表的HWM,而不是象DELETE 一样处理每行。
不生成还原数据。
通过查询数据字典可以得到表的信息:
- DBA_TABLES
- DBA_OBJECTS
表的统计信息
- 统计信息是造成系统效率低下的一个原因
- Oracle收集统计信息的方法
- DBMS_STATS.GATHER_TABLE_STATS
- DBA_TAB_STATISTICS
- 统计信息对系统资源的影响
约束条件
- NOT NULL(非空)
要求表列必须包含非空值。
- UNIQUE Key(唯一键)
要求一列或一组列(键)中的每个值必须唯一,即,在指定的列或一组列中,表任意两行的值不重复。 - PRIMARY KEY(主键)
单个列或一组列中的值就构成了行的唯一标识符。事实上,每行的名称均由其主键值确定。
正常情况下,数据库通过使用索引来强制设置PRIMARY KEY 约束条件:
- 该列中的唯一索引
- 该列的NOT NULL 约束条件 - 引用完整性约束条件
关系数据库中的各个表通过公用列相互关联,因此必须维护用于管理列关系的规则。使用引用完整性规则就可确保保持这些关系。 - 检查约束条件
单个列或一组列的CHECK 完整性约束条件要求为每个表行指定的条件必须为真或未知。如果数据操纵语言(DML) 语句对CHECK 约束条件的评估为假,则会回退语句。
索引
通过创建索引可提高数据更新和检索的性能
Oracle 索引提供到数据行的直接访问路径
可以对表的一个或多个列创建索引
创建索引后,Oracle 服务器会自动维护和使用索引
表数据的更新(如添加新行、更新行或删除行)会自动传播到所有相关的索引,这些对用户来说是完全透明的
如下2种字段适宜建立索引
-候选字段的唯一性很高
-- Select count(*) from (select distinct 所有索引 字段 from 表)返回结果和表的总记录数越接近越好
-候选字段总体唯一性虽然不高,但SQL中针对指定值查询,指定值在表中记录数很少
联机交易表上的索引数量不宜过多
-在有大并发增删改需求的联机交易表上创建索引建议不超过5个
新增索引有可能影响已有SQL的查询计划
-创建索引后,及时收集表的统计信息
-测试查看建索引后既有SQL的查询计划
复合索引注意事项
-一个SQL在单个表上只会使用表上的一个索引,因此如果where条件中用到多个字段,应考虑建复合索引
-应该选择最能过滤得到所需记录的字段放入索引
-所有复合索引字段组合的唯一性越高越好
-应优先将选择性最高的字段放在第一位。复合索引中其他字段的顺序也应该按选择性由高到低排列
通过查询数据字典可以得到索引信息:
- DBA_INDEXES
- DBA_IND_COLUMNS
视图
视图是一个或多个表或其它视图中数据的自定义表示
视图不仅可隐藏数据复杂性,还可存储复杂查询
可以按照某些限制条件对视图执行查询、更新、插入和删除操作
视图的基表
- 实际上,视图并不包含数据,而是从所基于的表中获取数据
- 对视图执行的所有操作实际上都会影响到视图的基表
创建视图
CREATE VIEW v AS SELECT location_id, country_name FROM
locations l, countries c
WHERE l.country_id = c.country_id AND c.country_id in ('AU','BR');
序列
序列是按照某种模式自动生成整数的一种机制
- 序列不与任何特定的表或列相关联。
- 增长方式可为升序,也可为降序。
- 编号之间的间隔可随意。
- 达到限额时,序列可循环。
- 通过缓存序列号可改善性能
创建序列:
CREATE SEQUENCE regions_seq
START WITH 3300
INCREMENT BY 100
MAXVALUE 9900
NOCACHE
NOCYCLE;
使用序列:
sequence.CURRVAL:返回序列的当前值
sequence.NEXTVAL:递增序列,返回下一个值(首次引用NEXTVAL 会返回序列的初始值
加速访问,内存中预分配了一组编号
如果存在实例失败的情况,就不会使用任何缓存的序列号,这会造成间隔
数据字典
Oracle 的数据字典是对数据库的描述
包含了数据库中所有对象的名称和属性
SELECT * FROM dictionary;
数据字典:
- 由Oracle 数据库服务器使用,可用于查找关于用户、对象、约束条件和存储的信息
- 对象结构或定义已修改时,由Oracle 数据库维护
- 任意用户可用来查询关于数据库的信息
- 由SYS 用户所有
- 不得使用SQL直接进行修改
DICTIONARY 数据字典视图或其DICT 同义词包含了数据字典中一切对象的名称和说明
使用DICT_COLUMNS 视图可查看视图列及其定义
用法示例:
SELECT table_name, tablespace_name FROM user_tables;
SELECT sequence_name, min_value, max_value, increment_by FROM all_sequences WHERE sequence_owner IN ('MDSYS','XDB');
SELECT USERNAME, ACCOUNT_STATUS FROM dba_users WHERE ACCOUNT_STATUS = 'OPEN';
DESCRIBE dba_indexes;
相关命令
创建用户:
create user test1027 identified by test1027;
desc dba_users;
create tablespace test1026 datafile '/home/db/oracle/oradata/testdb/test1026.dbf' size 5m;
alter user test1027 default tablespace test1026;
grant connect, resource to test1027;
conn test1027/test1027;
select username, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE from user_users;
desc all_users;
conn test1027/test1027;
创建表:
CREATE TABLE regions
( region_id NUMBER
CONSTRAINT region_id_nn NOT NULL
, region_name VARCHAR2(25)
);
创建索引:
CREATE UNIQUE INDEX reg_id_pk ON regions (region_id);
CREATE INDEX region_name ON regions ( region_name);
添加主键:
ALTER TABLE regions
ADD ( CONSTRAINT reg_id_pk
PRIMARY KEY (region_id)
) ;
查看表定义:
set long 1000;
select dbms_metadata.get_ddl('TABLE', 'REGIONS', 'test1027') from dual;
查询索引信息:
select index_name from user_indexes where table_name='REGIONS';
desc user_ind_columns;
col column_name for a20;
select INDEX_NAME, COLUMN_NAME, COLUMN_POSITION from user_ind_columns where TABLE_NAME='REGIONS';
查询约束:
desc user_constraints;
select CONSTRAINT_NAME, CONSTRAINT_TYPE from user_constraints where TABLE_NAME='REGIONS';
CREATE TABLE countries
( country_id CHAR(2)
CONSTRAINT country_id_nn NOT NULL
, country_name VARCHAR2(40)
, region_id NUMBER
, CONSTRAINT country_c_id_pk
PRIMARY KEY (country_id)
)
ORGANIZATION INDEX;
ALTER TABLE countries
ADD ( CONSTRAINT countr_reg_fk
FOREIGN KEY (region_id)
REFERENCES regions(region_id)
) ;
select CONSTRAINT_NAME, CONSTRAINT_TYPE from user_constraints where TABLE_NAME=UPPER('countries');
结果:
CONSTRAINT_NAME C
------------------------------ -
COUNTRY_ID_NN C
COUNTRY_C_ID_PK P
COUNTR_REG_FK R
列出创建的所有表:
select * from tab;
set line 50;
desc REGIONS;
插入、更新、删除操作:
insert into REGIONS values(1, 'test');
commit;(DML一定要提交insert\update\delete,否则只对当前会话有效,会话断开后将回退)
insert into REGIONS values(2, 'test');
insert into REGIONS values(3, 'test');
update regions set REGION_NAME='test_new' where REGION_ID=2;
delete from regions where REGION_ID=3;
commit;
insert into REGIONS values(4, 'test');
rollback;
创建另一个用户:
conn / as sysdba;
create user test1027_1 identified by test1027_1 default tablespace test1026;
grant connect, resource to test1027_1;
select username, created, default_tablespace from dba_users;
grant create view to test1027;
conn test1027/test1027
创建视图:
create or replace view view_rg as select * from regions;
desc user_views;
select VIEW_NAME from user_views;
创建SEQUENCE
CREATE SEQUENCE regions_seq
START WITH 3300
INCREMENT BY 100
MAXVALUE 9900
NOCACHE
NOCYCLE;
desc user_sequences;
select SEQUENCE_NAME from user_sequences;
创建同义词:
grant select, update, insert, delete on REGIONS to test1027_1;(test1027)
grant create synonym to test1027_1;(sysdba)
create or replace synonym REGIONS for test1027.REGIONS;(test1027_1)
desc REGIONS;(test1027_1)
conn / as sysdba
创建角色:
create role cntrclerk;
grant select on test1027.countries to cntrclerk ;
grant update on test1027.countries to cntrclerk ;
create role cntrmanager;
grant insert on test1027.countries to cntrmanager ;
grant delete on test1027.countries to cntrmanager ;
grant cntrclerk to cntrmanager;
select * from ROLE_TAB_PRIVS where TABLE_NAME='COUNTRIES'
select * from ROLE_ROLE_PRIVS where ROLE like '%CNTR%';
select USERNAME,GRANTED_ROLE from USER_ROLE_PRIVS;(当前用户的角色)
收集表的统计信息(sysdba)
conn / as sysdba
select TABLE_NAME,NUM_ROWS,LAST_ANALYZED from dba_tab_statistics where table_name='REGIONS';
exec DBMS_STATS.GATHER_TABLE_STATS('TEST1027', 'REGIONS');
select TABLE_NAME,NUM_ROWS,LAST_ANALYZED from dba_tab_statistics where table_name='REGIONS';