【发布时间】:2019-09-16 10:42:29
【问题描述】:
我有许多表,比如Metrics 和Results,其中一些表位于一个包含大量机密信息的大型数据库中。我设置了安全性,允许特定应用程序查看这些表中的数据。我不需要修改它们。总共涉及大约 200-300 个表,其中包含非机密信息。
与所有其他表一样,Metrics 是由数据库所有者/管理员创建的,比如dbo。如果我以dbo 连接,那么我可以简单地这样做:
select * from Metrics.
不幸的是,以数据库所有者身份连接也意味着我的连接用户可以看到所有表,而不仅仅是Metrics,还可以更新Metrics。
我想创建一个新用户 lowprivilege 并拥有 dba GRANT SELECT METRICS TO lowprivilege。
不幸的是,这意味着当我以低权限连接时,我需要限定表所有者:
select * from dbo.Metrics.
在 Oracle 下,一个 dba 怎样才能将 SELECT 授权给表,而授权的接收者不必限定表所有者?并且低权限用户除了在所选表中的选择之外应该没有任何权限。
备选方案 1 - 视图:
create view lowprivilege.Metrics as select * from dbo.Metrics
这是可能的,但我确实需要保留 * 通配符,因为我不知道 Metrics 中的所有列。另一个问题是,我希望每当 dbo.Metrics 重建时我的视图就会中断(这不应该经常发生)。
备选方案 2 - 创建同义词:
create or replace lowprivilege.Metrics FOR dbo.Metrics
dba 可以执行该操作并仅使用它授予 SELECT 吗?假设至少有一个 Oracle 12 版本。
备选方案 3 - GRANT SELECT 并切换架构:
GRANT SELECT METRICS TO lowprivilege
但是,每当lowprivilege 连接时,它都会使用alter session set current_schema=dbo。请注意,这需要在 SQLAlchemy /cx-Oracle 下实现。
另外,如果 dba 可以通过 DROP USER lowprivilege CASCADE 关闭所有内容,那就太好了。
实现这一目标的最佳方法是什么?
【问题讨论】:
标签: oracle sqlalchemy grant