oracle - Oracle中相同的表名,相同的架构,不同的用户
问题描述
我有以下要求:
- TABLE1 是表名
- 每个用户都应该有权访问他们的 TABLE1 版本
- 不同 TABLE1 表中的数据由其用户管理。
- 用户不应有权访问其他用户的 TABLE1
- 所有 TABLE1 表都应驻留在同一架构中
- 当用户
select * from TABLE1
在 SQL 客户端中运行时,他们应该看到他们的 TABLE1 版本。
是否有可能在 Oracle 中实现这一点?
解决方案
你写的一切都是可能的,除了
- 所有 TABLE1 表都应驻留在同一架构中
因为在同一个模式中不能有两个同名的表。
“模式”= 用户 + 其对象(表、视图、过程……)。因此,每个用户都可以拥有自己的TABLE1
表。
似乎还有另一种模式可以聚合每个人TABLE1
表中的数据。为此,您可以创建一个视图
create or replace view v_table1 as
select 'USER1' owner, t.* from user1.table1 t union all
select 'USER2' , t.* from user2.table1 t union all
...
这意味着您编写的最终条件应该扩展一点,添加WHERE
子句,例如
select * from v_table1 where owner = 'USER2'
另一方面,如果每个用户都有自己的TABLE1
,他们为什么要查询“聚合” (v_)TABLE1
?
最后,检查 VPD(虚拟私有数据库)。简单来说:
Oracle 虚拟专用数据库 (VPD) 使您能够创建安全策略来控制行和列级别的数据库访问。从本质上讲,Oracle 虚拟私有数据库将动态 WHERE 子句添加到针对应用了 Oracle 虚拟私有数据库安全策略的表、视图或同义词发出的 SQL 语句。
更多信息在这里:https ://docs.oracle.com/cd/B28359_01/network.111/b28531/vpd.htm#DBSEG98215
推荐阅读
- excel - 如何根据当前工作表路径进行合并
- sql - 如何覆盖此函数以将数据存储在数据库中?
- if-statement - 如何从具有不同字数的异构变量中提取中间名?
- reactjs - Highcharts-React 返回 Object 并且 React 给出错误 - React.createElement: type is invalid
- python - 使用串行连接进行控制时,如何使用 arduino 控制 bldc 电机?
- java - 由于“插件 uBlock0@raymondhill.net 未正确签名”,Selenium 未安装 Firefox 插件
- html - 离子选择无法使用动态值正确渲染?离子 4
- scala - 计算列表中的连续字符?
- gpu - Numba 中的组合矢量化函数
- visual-studio - MS Unity 在初始化后立即失败