Oracle数据库有一个用户的概念,我把不同的用户理解为不同的库。
简单来说,我把交易库称为TRADE用户,我把客户管理的库成为ACCOUNT用户。
正常情况下,每个用户访问自己对应的表,但是当需要跨用户访问时,我们就有三个选择。
一.交易库赋予客户库查询交易表权限,我们称之为授权,关键字为grant。
现在我们模拟从A用户,把ableName的操作权限赋予B用户,以下授权语句应该在A库执行。
1. SELECT * FROM dba_users; --查询数据库中的所有用户
2.GRANT SELECT ON tableName to B;--授权查询(将表tableName的查询权授给B)
GRANT INSERT ON tableName to B;--授权插入(将表tableName的插入权授给B)
GRANT UPDATE ON tableName to B;--授权更新(将表tableName的更新权授给B)
GRANT UPDATE ON tableName to Bwith grant option; --授权更新权限转移给用户,被用户可以继续授权给其他用户;
GRANT EXECUTE ON ProceDureName to B;--授权存储过程
3.Revoke select on tableName from B; --收回查询表的权限;
Revoke all on tableName from B;--收回表tableName 的所有权限;
4.SELECT * from dba_tab_privs where grantee=upper('DC_CH');--查询一个用户被赋予的对象权限
SELECT * from dba_sys_privs where grantee=upper('DC_CH');--查询一个用户拥有的系统权限
SELECT* from session_privs ;--当前会话有效的系统权限
这样,我们直接就可以从B用户操作A用户的tableName这张表了,对应的语句为
SELECT * from A.tableName;
UPDATE A.tableName set...等等
二.把操作粒度变大一点,使B用户像操作自己的表一样操作A用户中的表,引入同义词这个概念
同义词的好处
1、不占内存空间,节省大量的数据库空间
2、简化了数据库对象的访问
3、提高了数据库对象访问的安全性
4、扩展的数据库的使用范围,能够在不同的数据库用户之间实现无缝交互;同义词可以创建在不同一个数据库服务器上,通过网络实现连接
1.在A用户中建立私有同义词
CREATE SYNONYM TB FOR tableName;
这样SELECT * FROM TB= SELECT * FROM tableName.
假设我们已经把这张表的不同权限授予了B用户,那么我们可以从B中以SELECT * FROM A.TB的形式访问到tableName。
2.在A用户中建立共有同义词
CREATE PUBLIC SYNONYM TB FOR tableName;
这样这个库下的所有用户都能直接以SELECT * FROM TB的方式访问tableName。
-- 删除公有同义词: drop public synonym TB ; -- 删除私有同义词: drop synonym TB ;
三.粒度更大一点,B用户可以操作A用户下面全部的表,引入DB Link。
1.通过界面化工具建立数据库连接。
2.通过SQL语句建立数据库连接
create database link DS
connect to DS_CH identified by ds
using '192.168.1.244/orch';
从B用户访问A用户的表的方式为 SELECT * FROM TB@A.
这样三种库用户访问的方式就介绍完了,至于如何取舍,还是根据实际情况来决定。