Oracle中使用高低权限的两个账户访问同一数据库(划分权限职责)
应用场景
- 使用Oracle过程中,希望一部分使用人员可以修改表结构等,而另一部分人员只能增删改查
- 为了增加安全性,程序连接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中查询用户和权限
- 查看所有用户:
select * from dba_users;
select * from all_users;
select * from user_users; - 查看用户或角色系统权限:
select * from dba_sys_privs;
select * from user_sys_privs; - 查看用户对象权限:
select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs; - 查看所有角色:
select * from dba_roles; - 查看用户或角色所拥有的角色:
select * from dba_role_privs;
select * from user_role_privs;