oracle用户与权限

oracle用户与权限

在安装好Oracle数据库之后我们的任务自然是保证数据库的安全性。

管理默认账号

​ 在创建数据库实例的时候,Oracle会给我们创建出一些账号,在Oracle 10g 来说,如果不在安装过程中修改配置,默认情况下,除了sys、system 账号都是出于锁定的。

​ 在安装完毕之后,我们可以通过以下SQL查看有哪些默认用户,结果如图所示。

select username from dba_users;

oracle用户与权限_第1张图片

​ 我们可以看到,有很多的默认账号,我们无法区分那些账号是我们需要到的,不要试图删除默认账号,不然一旦出现问题不好恢复,我们用不到让他处于锁定状态就可以了。

​ 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不会删除依赖被删除用户拥有对象的视图、同义词、过程、函数或软件包,但会使他们失效。

密码操作

Oracle修改密码

alter user SCOTT identified by values '12345';

Oracle找回密码

​ 有时候我们可能要使用找回密码功能,比如我们项目中比较多地方使用了账号密码的硬编码,这个时候该项目就不太现实。

  1. 使用dba特权用户查看用户的配置文件,下面以找回SCOTT用户的密码为例。

     select username,profile from dba_users where username='SCOTT';
    
  2. 创建一个临时的配置文件。

    create profile temp_prof limit PASSWORD_REUSE_MAX unlimited PASSWORD_REUSE_TIME unlimited;
    
  3. 将这个配置文件分配给改用户。

    alter user SCOTT profile temp_prof;
    
  4. 查看

    select password from SYS.user$ where name='SCOTT';
    

在这里插入图片描述

  1. 此时将密码修改为此密码即可

    alter user SCOTT identified by values '123456';
    
  2. 将原来的配置分配给用户

    alter user SCOTT profile default;
    
  3. 删除临时配置文件

    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;

你可能感兴趣的:(Oracle)