Oracle中使用高低权限的两个账户访问同一数据库(结构数据分开管理)

mtain 2017年05月13日 788次浏览

Oracle中使用高低权限的两个账户访问同一数据库(划分权限职责)

应用场景

  1. 使用Oracle过程中,希望一部分使用人员可以修改表结构等,而另一部分人员只能增删改查
  2. 为了增加安全性,程序连接Oracle的账户只需要增删改查数据和调用函数,而不需要新建数据表,修改表结构和导入导出数据库

账户权限划分

**高权限账户:**数据库的所有者,创建和修改表结构,新建修改调用方法,增删改数据表和视图,导入导出数据库
**低权限账户:**不存储数据,只能增删改查数据表和视图,调用方法

实现思路

高权限账户是数据库A的所有者,它通过创建公共同义词和授权给滴权限账户,使得低账户权限可以增删改查数据库A的数据表和视图,调用数据库A中方法

具体操作过程

1. 创建高权限账户

-- 创建表空间
CREATE TABLESPACE DATA_A
DATAFILE '/u01/app/oracle/oradata/orcl/DATA_A01.dbf' size 2000M
         EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

drop user DATA_A cascade;
--创建用户
create user DATA_A identified by password_a;
--授权
grant connect,resource,dba to DATA_A;

-- 表空间
alter user DATA_A default tablespace DATA_A;
alter user DATA_A quota unlimited on DATA_A;

如果需要从其它数据库导入数据可执行:

-- 导入数据更换表空间
impdp DATA_A/passwd@orcl directory=dpdata dumpfile=DATA_20170513_140000.dmp REMAP_SCHEMA=DATA:DATA_A remap_tablespace=USERS:DATA_A EXCLUDE=USER table_exists_action=REPLACE

2. 创建低权限账户

-- 创建表空间
CREATE TABLESPACE DATA_B
DATAFILE '/u01/app/oracle/oradata/orcl/DATA_B01.dbf' size 2000M
         EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

drop user DATA_B cascade;
--创建用户
create user DATA_B identified by password_b;
grant connect to DATA_B;

-- 表空间
alter user DATA_B default tablespace DATA_B;
alter user DATA_B quota unlimited on DATA_B;

3. 高权限账户创建同义词()

以下SQL拼装出表,视图和方法对象创建公共同义词所需要执行的SQL,将执行结果复制出来,执行即可

select 'create or replace synonym DATA_B.'|| object_name || ' for ' ||'DATA_A'|| '.' || object_name || ';' from dba_objects where object_type in ('TABLE','VIEW','FUNCTION') and owner='DATA_A';

创建公共同义词SQL如:create or replace public synonym Table_1 for DATA_A.Table_1;

**注意:**新建表要建立公共同义词后,DATA_B才能使用

4. 高权限账户授权低权限访问对象

以下SQL拼装出表,视图和方法对象授权访问所需要执行的SQL,将执行结果复制出来,执行即可

-- 数据表和试图的增删改查权限
select 'grant select,insert,update,delete on DATA_A.'|| object_name || ' to '||' DATA_B'|| ';' from dba_objects where object_type in ('TABLE','VIEW') and owner='DATA_A';

-- 方法对象的调用权限
select 'grant execute on DATA_A.'|| object_name || ' to '||' DATA_B'|| ';' from dba_objects where object_type = 'FUNCTION' and owner='DATA_A';

授权的SQL:

grant select,insert,update,delete on DATA_A.Table_1 to DATA_B;
grant execute on DATA_A.Function_1 to DATA_B;

**注意:**新建表和重建表要授权后,DATA_B才能使用

至此,可以使用DATA_B增删该查DATA_A的表和视图,调用DATA_A的方法,而没有创建表等高级权限

附录

connect resource权限

CONNECT角色: --是授予最终用户的典型权利,最基本的
    ALTER SESSION --修改会话
    CREATE CLUSTER --建立聚簇
    CREATE DATABASE LINK --建立数据库链接
    CREATE SEQUENCE --建立序列
    CREATE SESSION --建立会话
    CREATE SYNONYM --建立同义词
    CREATE VIEW --建立视图
RESOURCE角色: --是授予开发人员的
    CREATE CLUSTER --建立聚簇
    CREATE PROCEDURE --建立过程
    CREATE SEQUENCE --建立序列
    CREATE TABLE --建表
    CREATE TRIGGER --建立触发器
    CREATE TYPE --建立类型

Oracle中查询用户和权限

  1. 查看所有用户:
    select * from dba_users;
    select * from all_users;
    select * from user_users;
  2. 查看用户或角色系统权限:
    select * from dba_sys_privs;
    select * from user_sys_privs;
  3. 查看用户对象权限:
    select * from dba_tab_privs;
    select * from all_tab_privs;
    select * from user_tab_privs;
  4. 查看所有角色:
    select * from dba_roles;
  5. 查看用户或角色所拥有的角色:
    select * from dba_role_privs;
    select * from user_role_privs;