在安装好Oracle数据库之后我们的任务自然是保证数据库的安全性。
在创建数据库实例的时候,Oracle会给我们创建出一些账号,在Oracle 10g 来说,如果不在安装过程中修改配置,默认情况下,除了sys、system 账号都是出于锁定的。
在安装完毕之后,我们可以通过以下SQL查看有哪些默认用户,结果如图所示。
select username from dba_users;
我们可以看到,有很多的默认账号,我们无法区分那些账号是我们需要到的,不要试图删除默认账号,不然一旦出现问题不好恢复,我们用不到让他处于锁定状态就可以了。
sys和system账号的区别:sys是数据库的超级用户账号,而system只是一个获得dba权限的用户账号。一般我们可以锁定system,创建一个没这么容易猜测到的dba账号,提高安全性。
我们可以通过以下SQL解锁锁定的账号
alter user SCOTT account unlock;
下面创建一个lucky
账号,并且解锁账号。
CREATE USER lucky IDENTIFIED BY "123456" ACCOUNT UNLOCK
DEFAULT tablespace USERS
temporary tablespace TEMP
quota unlimited on USERS;
创建用户的时候分配一下表空间,不然下面的演示无法创建数据表。当然后面进行分配也是可以的
创建出来的lucky
账号是一个没有任何权限的账号,甚至连登陆都不可以,我们需要给他赋予一个登陆权限。
grant create session to lucky;
现在可以切换登陆账号:
conn lucky/123456;
现在的
lucky
用户只有一个登陆权限,需要其他权限管理,请看下面的权限管理
在删除用户之前,建议先锁定用户,因为这样我们可以知道是否有人正在使用这个账号。
alter user lucky account lock;
如果有人使用,将会报错 the account is locked
如果确定不再使用
drop user lucky;
如果不成功
drop user lucky cascade;
在删除用户,被删除的用户拥有的所有表都会被删除。此外,该用户所有的索引、触发器和参照完整性约束也会被删除。如果其他方案中的参照完整性约束依赖被删除的主键和唯一键约束,那么这些参照完整性约束也会被删除。oracle不会删除依赖被删除用户拥有对象的视图、同义词、过程、函数或软件包,但会使他们失效。
alter user SCOTT identified by values '12345';
有时候我们可能要使用找回密码
功能,比如我们项目中比较多地方使用了账号密码的硬编码,这个时候该项目就不太现实。
使用dba特权用户查看用户的配置文件,下面以找回SCOTT
用户的密码为例。
select username,profile from dba_users where username='SCOTT';
创建一个临时的配置文件。
create profile temp_prof limit PASSWORD_REUSE_MAX unlimited PASSWORD_REUSE_TIME unlimited;
将这个配置文件分配给改用户。
alter user SCOTT profile temp_prof;
查看
select password from SYS.user$ where name='SCOTT';
此时将密码修改为此密码即可
alter user SCOTT identified by values '123456';
将原来的配置分配给用户
alter user SCOTT profile default;
删除临时配置文件
drop profile temp_prof;
在oracle 中,我们必须要为用户分配权限,才能让他们在数据库进行操作,一般我们有两种方式:一、直接给用户分配对应的权限;二、我们可以将对应的权限分配给角色,然后将角色赋予用户的方式。权限分为系统权限和对象权限。以下我们从权限的分配和收回进行讲解。
系统权限主要包括数据库连接、创建修改对象之类的任务,我们可以查看Oracle中的系统权限
select distinct privilege from dba_sys_privs;
查看当前用户有哪些权限
select * from session_privs;
我们采用 grant
分配权限,多个权限用 ,
隔开,用 with admin option
子语句进行权限传递性。
单个权限
grant create session to lucky;
多个权限
grant create session,create table to lucky;
分配dba权限
grant create session,create table to lucky;
分配给所有用户 即 public
但不建议这么使用
grant create session,create table to public
使 lucky
用户也拥有为其他用户分配权限的能力,即管理权限的能力
grant create session,create table to lucky with admin option;
回收权限
revoke create session from lucky;
需要注意的是,回收权限是没有传递性的,例如:
lucky
用户给tom
分配了权限,那么以上语句只能回收lucky
的权限,lucky
将不能登录,但是tom
依然可以登录。
附:常见的系统权限
权限名称 | 功能介绍 |
---|---|
create session | 拥有此权限才能连接数据库 |
create table | 拥有创建表的权限 |
create role | 创建角色的权限 |
create view | 建视图 |
create procedure | 建过程、函数、包 |
create public synonym | 建同义词 |
create trigger | 建触发器 |
拥有数据库对象权限可以访问和操作其他用户的对象。可赋予的数据库对象权限包括:表、视图、物化视图、序列、软件包、函数、过程、用户自定义类型和目录的权限。要获得赋予对象权限的能力,必须符合下列条件之一:
拥有对象,即自己拥有对象,想分配给其他用户操作此对象的权限;
已经通过 WITH GRANT OPTION
子句获得了对象权限;
拥有CRANT ANY OBJECT PRIVILEGE
系统权限。
或者我们可以比较形象的想象为表对象的分享,比如现在比较流行的在线文档,我将表可以分享给指定的人,并可以限制他的权限,设置为可读、可编辑等。oracle中对象权限的概念和这个差不多,大家可以对比更助于理解。
查看系统中对象权限
select distinct privilege from dba_tab_privs;
下面列出常见的对象权限,看名字我们就大概知道是什么意思了,就不在做详细的解释。
alter
delete
select
insert
update
index
references
execute
下面我们举例说明分配权限的过程,我们用 conn lucky/123456
连接lucky
用户,我们先用 lucky
用户创建一个test_tb
表,并插入数据:
create table test_tb(ID varchar2(30));
insert into test_tb values('12345');
select * from test_tb;
切换为sysdba
身份新建一个TOM
用户,并分配权限
CREATE USER TOM IDENTIFIED BY "123456" ACCOUNT UNLOCK
DEFAULT tablespace USERS
temporary tablespace TEMP
quota unlimited on USERS;
grant create session,create table to TOM with admin option;
切换到TOM
账号,我们可尝试使用TOM
账号查询 lucky.test_tb
表,
select * from lucky.test_tb;
没有权限我们会发现报错信息[ORA-00942: 表或视图不存在],由于Tom没有权限查看此表,自然报错找不到。
切换到LUCKY
账号,LUCKY
拥有 test_tb
表,现在要将他的权限分配给 TOM
用户,下面两种写法都可以:
grant all on test_tb to TOM;
--或者
grant select,insert,update,delete on test_tb to TOM;
all 即已经包括了select,insert,update,delete 这些权限,有时我们需要设置为只读,那么我们可以设置为select即可,按需求而定。
我们想要对象权限可以以级联的方式将相同的对象赋予其他用户,可以使用WITH GRANT OPTION
子语句。例如:
grant all on test_tb to TOM WITH GRANT OPTION;
回收权限
revoke all on test_tb from TOM;
--或者指定回收某个权限,如下指定回收删除权限。
revoke delete on test_tb from TOM;
我们采用将一系列权限绑定到一个角色,然后将这个角色分配给多个用户,这个方式更加有利于我们的管理,更加方便使用。
首先我们应该创建一个角色,先切换到 dba用户:
create role test_role;
然后我们将权限分配给这个角色:
grant select any table to test_role;
grant create any table to test_role;
grant create any view to test_role;
grant create any synonym to test_role;
grant create database link to test_role;
--查看用户和默认表空间的关系
select username,default_tablespace from dba_users;
--查看当前用户能访问的表
select * from user_tables;
--Oracle查询用户表
select * from user_all_tables;
--Oracle查询用户视图
select * from user_views;
--查询所有函数和储存过程:
select * from user_source;
--查询所有用户:
select * from all_users;
--select * from dba_users
--查看当前用户连接:
select * from v$Session;
--查看用户角色
SELECT * FROM USER_ROLE_PRIVS;
--查看当前用户权限:
select * from session_privs;
--查看所有用户所拥有的角色
SELECT * FROM DBA_ROLE_PRIVS;
--查看所有角色
select * from dba_roles;
--查看数据库名
SELECT NAME FROM V$DATABASE;
--查询所有函数和储存过程:
select * from user_source;
--查询所有用户:
select * from all_users;
--select * from dba_users
--查看当前用户连接:
select * from v$Session;
--查看用户角色
SELECT * FROM USER_ROLE_PRIVS;
--查看当前用户权限:
select * from session_privs;
--查看所有用户所拥有的角色
SELECT * FROM DBA_ROLE_PRIVS;
--查看所有角色
select * from dba_roles;
--查看数据库名
SELECT NAME FROM V$DATABASE;