一、Sql * plus 常用命令

1.关于登录,连接的几个命令

1) conn[nect] //例  conn system/manager

用法 conn 用户名/密码 @网络服务名 (as sysdba/sysoper)

当特权用户登录的时候,必须带上 as sysdba/sysope

比如 sys用户登录,就必须这么写 conn  sys/aaaaaaa as sysdba

2) show user //当显示当前登录的用户是哪一个

3) disc[onnect] 断开连接

4) exit 断开,退出

5) clear scr

6) alter user identified by 新密码

2.关于文件操作的命令

1) start 和 @

运行文件中的 sql脚本

@ c:\sql; 或 start c:\sql;

2) spool

可以将sqlplus 屏幕上的内容存到文本文件中

spool c:\b.sql;

运行sql脚本

....

select * from table1

spool off;

3.交互式命令

1 & 可以替代变量,该变量在执行时,要由用户输入

select * from userinfo where userId='&AAA' //在 sql developer 中也好用

4. 显示和设置环境变量

可以用来控制各种格式,如果希望永久保存格式,可以去修改 glogin.sql角本

1)linesize 设置显示行的宽度,默认是80字符

show linesize
set linesize 120

2)pagesize 设置每页显示行的数目 默认40 行

二、Oracle 中表的管理(重要内容)

1) 命名规则

oracle中表和列的命名规则

-- 必须以字母开头(数字不行)    ,下划线 _ 也不行

-- 长度不能超过30个字符

-- 不能使和Oracle 保留字 //比如用 level 做字段名

-- 只能使用如下字符 'A-Z','a-z',0-9,$,# 等

2) 数据类型

-- char 定长字符串,最大2000个字符

-- varchar2 变长字符串,最大4000个字符

-- clob(character large object ) 字符型大对象 最大4G

-- bolb 二进制数据,可以存放图片,声音等 最大 4G

-- number 范围 -10 的38 次方,到10 的 38 次方

-- number (8,2) 可以表示带小数点的数

-- data 日期类型,包 含年月日,时分秒

-- timestamp 时间戳

3)关于日期类型的说明

//创建一个表
create table STUDENT
(
ID NUMBER(4),
STUNAME VARCHAR2(20),
SEX CHAR(2),
BIRTHDAY DATE,
SAL NUMBER(5,2)
)

添加一条数据

insert into student values (1,'陈鹏飞','男','1999-09-09',9999.99)
//会报错,文字与格式字符串不匹配
//因为这里的 '1999-09-09' 格式不正确 oracle 默认的日期格式是 DD-MON-YY
//修改日期格式的语句
alter session set nls_date_format ='yyyy-MM-dd'

3) 删除数据

delete from student  //删除所有记录,表格构还在,写日志,可以恢复,速度慢

drop tablue student //连表结构一起删除

truncate table student //删除表中的数据,表结构在,不写日志,速度快,无法恢复,在sqlserver 或mysql中,它会重置自增主键

savepoint aaa;
delete from student ;
rollback to aaa;

4) 关于查询

查看执行sql语句用的时候

set timing on //显示一条语句的执行时间

//例如 :
set timing on
select * from student

结果:

ID STUNAME              SEX BIRTHDAY        SAL
 ----- -------------------- --- ----------- -------
1 陈鹏飞               男  1999-9-9     999.99
Executed in 0.016 seconds

// 注意:严格区分大小写

select * from student where stuName='AA'; 

//大写的AA和小写的aa 在oracle中是不同的

mysql :默认查询的时候是不区分大小写的 如果就想区分大小写  SELECT * FROM userInfo where userName= binary ('aaa')

sqlservler :默认也不区分 如果想区分, select * from userInfo where userName= 'aaa' collate Chinese_PRC_CS_AI

或 alter  column 字段名 nvarchar(20) collate Chinese_PRC_CS_AI

//关于 null 值

-- 查看姓名,工资,工资 + 奖金 , 奖金

select ename,sal,sal+comm, comm  from scott.emp;

可以发现 , 数值和null 相加,结果也是 null

输出结果:                  
ENAME            SAL   SAL+COMM      COMM
---------- --------- ---------- ---------
SMITH         800.00            
ALLEN        1600.00       1900    300.00
WARD         1250.00       1750    500.00
JONES        2975.00            
MARTIN       1250.00       2650   1400.00
BLAKE        2850.00

如何处理? 使用 nvl

select ename,sal,nve(sal,0)+nvl(comm,0), comm  from scott.emp;

查年薪 : select ename,sal,sal*12+nvl(comm,0)*12 as 年薪, comm  from scott.emp;

查工资最高的人的姓名和工资 SQL> select ename ,sal from scott.emp where sal =(select max(sal) from scott.emp);

三、Oracle 中的序列(重要内容)

序列( sequence ) 是一个计数器,它不会与特定的表关联

通过创建 sequence 和触发器实现表的自增主键,序列一般用来添充主键或计数

//创建序列

create sequence seq_id    //seq_id 是可以任意指定的序列的名称
minvalue 1
start with 1
increment by 1
cache 20; //定义存放序列的内存块的大小,默认是20,实例异常关闭的时候,可能会造成数据丢失
//查看序列

select * from USER_SEQUENCES  //只能查看用户自己的
select * from ALL_SEQUENCES
select * from DBA_SEQUENCES
//删除序列
drop sequence seq_id

思考:如何使用

当要使用序列的值的时候, 直接调用它的 nextval

比如:

seq_id.nextval //注意:后面没有() ,它是一个属性值

select   seq_id.nextval from dual;

使用的方式

方式一 ,不使用触发器,在插入数据的时候,使用序列生成主键

insert into student (id,stuName,sex,sal) values ( seq_id.nextval,'马苗','女',8888.88) 

说明: seq_id是序列的名称

方式二 建立触发器,当有数据添加的时候由触发器使用序列生成主键

create trigger TRG_TEST before insert on student
for each row
begin
select seq_id.nextval into :new.id from dual;
end ; //后面的分号不能少

创建触发器以后,再对这个表进行inser 的时候,主键就会自动增长

//需要注意: 对于两个表的自增主键,用同一个序列,它产生的序号会被分着用

附 hibernate  和  sequnce

根据hibernate的文档,有两种方式实现实体对象的主键自动增长。

第一种:设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL,MY-SQL中的自动增长一样,不需要创建触发器,具体的oracle数据库脚本及hibernate配置文件: 略 */

可以看到 在oracle 使用序列还是很麻烦的,所以建议对oracl中的主键,尽量不要使用自增,可以使用varchar2 ,添加的时候,用uuid java.util.UUID.randomUUID();

四、Oracle 中的用户管理

1、创建用户

create user  //一般具有 dba(数据库管理员) 的权限才能使用

create user nicecat identified by nicecat      建立一个名为nicecat 的用户,密码也是nicecat

注意: 密码必须以 字母开头

2.删除用户

一般情况下,要用dab的身份去删除用户, 如果是别的用户进行用户删除操作,要有 drop user 的权限,自己不能删除自已 drop user 用户名 [cascade]

注意:cascade 是级联的意思,如果被删除的用户已经创建了表,则连他的表一起删除

3.授权

grant connect to nicecat ; //把 connect 这个角色授给 nicecat

4.口令管理

使用 profile 管理用户口令

profile 是口令限制,资源限制的集合,当建立数据库时,oracle 会自动建立名为 default 的profile。当建立用户的时候,如果我们没指定 profile,那么oracle 就会将 default分配给用户。

思考:如何实现用户锁定

1.可以指定用户登录时最多可以输入密码的次数

2.可以指定用户锁定的时间(天)

3.一般会用dba的身份去执行该命令

例子: 指定nice cat 用户,最多能尝试3次登录,锁定时间为2天

1) 创建 profile 文件

create profile aaa_prifle limit failed_login_attempts 3 password_lock_time 2 ;
//时间可以用小数

2) 把规则交给某个用户

alter user nicecat profile aaa_prifle

//附解锁
alter user nicecat account unlock; //必须有这个权限的用户才能执行

3)口令历史

如果希望用户在修改密码的时候,不能使用以前10天以用过的密码

create  profile bbb_profile limit password_reuse_time 10

4)删除 profile

drop  profile +名称

五、Oralcle 中的权限管理

Oracle 中的权限分两类

第一类:系统权限

系统权限通常是针对修改数据字典,修改数据库实例的情况进行控制,例如,创建用户,创建表空间,控制会话,建库,建表,建存储过程,登录数据库等,描述的就是用户对数据库的相关权限。

比如

-- 用户 必须有 create table 权限 则在自已的方案中建表

-- create any table 权限,可以在任意的方案中建表

-- create session 要登录数据库,就要有这个权限

常见的系统权限有

create session  //连接数据库的权限

create table //建表

create view // 建视图

create public synonym //建同意词

create trigger  //建触发器

create procedure  //建存储过程

...

 //查询一共有多少种系统权限

select * from system_privilege_map   //在oracle 10g中,实测166条

==授予系统权限

一般情况下,授予系统权限是由dba来完成的,如果是其他的用户,要有grant any privilge 权限才可以

1) 创建两个用户   mm 马苗   jcp

create user mm identified by mm ;
create user jcp identified by jcp;

2) 授权

grant create session,create table  to mm   with admin option    //注意 是 with "admin" option

如果在授权时,带用  with admin option  ,则被授权的用户,可以把这个权限再传给别人

3) 回收

revoke  create session, create table  from mm 

用的 是system 回收了 mm 的系统权限,能不能影响到 mm 授给 jcp的权限呢 ? 答案是不会,对于系统权限,在回收的时候,不会级联回尽管。

第二类:对象权限

访问其他方案中的数据对象的权力,用户可以访问自已方案中的对象,但要访问别人方案中的对象,则要有对应的对象权限才。 数据对象 表,存储过程,触发器,序列等。常用的对象权限有:

alter //修改(表结构)

delete

update

insert

index //建索引

references //引用

execute  //执行

...

查询一共有多少对象权限  select * from table_privilege_map    //约 24 种

==授予对象权限

对象权限即可以授予用户,也可以授予角色,和public (public 表示数据中所有的用户都具有些权限) grant create session to public

如果带用 with grant option 选项,则可以把权限往下传递, 但是,要注意:    /* with grant option  不能授予角色 */

着重说明:

如果给 mm 授予了对象权限,带了  with grant option  选项, 如果对mm 进行对象权限的回收,会不会影响 mm 授予其他人的权限呢?

答案是会,对于对象权限,在回收的时候,是级联回收的。

//例子 scoot 用户把emp表的所有对象权限交给 mm ,mm 再把 该表的select 权限交给 jcp ,然后再回收 mm 的权限,查看jcp会不会受到影响

1) 用scott用户登录

conn scott/scott
grant all on emp to mm with grant option; //把emp表的所有权限授给mm,并且允许mm往下传递

2) 用 mm 登录

conn mm/mm;
select * from scott.emp //可以了,因为有权限了
grant select on scott.emp to jcp; //由马苗把 权限授给 jcp 可以

3) 用 jcp 登录

conn jcp/jcp
select * from scott.emp //可以.因为从mm处得到的授权
delete from scott.emp //不可以,没有权限

4) 用scott登录,收回给mm权限

revoke all on emp from mm;

这时,mm 对 emp表所有的对象权限都会被回收,同时, jcp对该表的权限也被回收了。

谁可以对 scott.emp 表进行对象权限的授权 ?

sys , system , scott

==关于权限的传递

希望 cat 用户,可以查询scott 的 dept 表,还希望他可以把这个权限往下传递

===这个需求是对对象权限的需求 加入 with grant option  //级联回收

conn system/aaaaaaaa
grant all on scott.emp to cat with grant option

===假如系统权限 要加入 with admin option  //不级联回收

grant create session ,create table on 用户名 with admin option

六、角色管理

角色: 相关权限命令的集合

一般是由dba 创建的,或者有由有create role 系统权限的用户创建的。

角色有两种:

自定义角色,预定义角色 以下几个,是系统预定义的角色

--connect //用于连接

--dba

--resurce //可以让用户在任意表空间建表

问题 如果nicecat 用户授权了 dba ,还用不用授权connect 了? 不需要因为 dba 包含 connect

== 建立角色

在建立角色的时候,可以指定验证方式,也可以不指定

1) 建立角色(不验证)

如果角色是共用的角色,可以采用不用验证的方式建立

create role 角色名 not identified
//创建一个角色 查询所有的角色 select * from dba_roles (名字变大写了)

2) 建立角色(数据验证)

采用这种方式时,角色名,口令,放在数据库中,当激活角色时,必须提供口令,在建立的时候,也要提供口令

create role 角色名 identified by 密码

== 角色的授权

角色开始建立的时候,它是空的,必须授予相应的权限才能使用。

给角色授权和给用户授权差不多,但系统的 unlimited tablespace 和 对象的 with grant option 选项不能授予角色

create role super_admin not identified
//创建角色 super_admin 现在是空的,下面是授权
grant  create session  to super_admin with admin option
//给角色授予系统权限,并可以让它进权限传递
grant  select on scott.emp to super_admin
//给角色授予对象权限,后面不可以加 with grant option

grant  select,insert,update on scott.dept to super_admin

== 把角色分配给用户

grant 角色名 to 用户名  //with admin option

-- 删除角色

drop role 角色名

//如果删除了角色,则这个角色对应的用户将失去角色所对应的权限

-- Oracle 中包含多少角色

select * from dba_rolse; //30多种

-- 显示角色所具有系统权限

select * from role_sys_privs where role='角色名'

-- 显示角色所具有的对象权限

select * from role_tab_privs where role='角色名'

-- 显示用户具有哪些角色

select * from dba_role_privs where grantee ='SCOTT'

结果:

GRANTEE                        GRANTED_ROLE                   ADMIN_OPTION DEFAULT_ROLE
------------------------------ ------------------------------ ------------ ------------
SCOTT                          RESOURCE                       NO           YES
SCOTT                          CONNECT                        NO           YES
ADMIN_OPTION  表示该用户是不是可以把这个权限往下传递

最新文章

  1. Linux下oracle数据库启动和关闭操作
  2. linux配置本地源
  3. 第二篇:SOUI源码的获取及编译
  4. YAFFS2文件系统分析(转)
  5. 电视直播用的.m3u8 PC端和移动端地址 【流媒体播放测试专用】
  6. C++智能指针管理类
  7. 缓存应用--Memcached分布式缓存简介
  8. angularjs $swipe调用方法
  9. HDU2167+状态压缩DP
  10. 8 Pratical Examples of Linux “Touch” Command--reference
  11. MonkeyRunner于Windows在下面Eclipse开发环境的搭建步骤(并解决在线Jython配置错误的问题)
  12. Android:关于Edittext的一些设置
  13. 如何使用 ui-router-extras
  14. CSS预处理器之Less详解
  15. Document APIs
  16. 痞子衡嵌入式:ARM Cortex-M内核那些事(2)- 第一款微控制器
  17. MyCP课下作业
  18. HTTP Health Checks
  19. android toolbar使用记录
  20. 20155227《网络对抗》Exp6 信息收集与漏洞扫描

热门文章

  1. 2、JavaScript 基础二 (从零学习JavaScript)
  2. Unity3D之物理射线
  3. 微服务ServiceMesh及三种模式介绍
  4. IntelliJ IDEA 注册码(因为之前的地址被封杀了,所以换了个地址)
  5. java相关技术问答(二)
  6. Tomcat简介
  7. js深拷贝与浅拷贝
  8. Java程序员如何运用所掌握的技术构建一个完整的业务架构
  9. welcome-file-list修改后不生效
  10. 学习之响应式Web设计---一个实例