我有许多表,例如Metrics
和Results
,其中的一些表是在具有大量机密信息的大型数据库中。我设置安全性,以允许特定的应用程序查看那些表中的数据。我不需要修改它们。总共约有200-300张桌子,其中包含不保密的信息。
与所有其他表一样,度量标准是由数据库所有者/管理员创建的,例如dbo
。如果我以dbo
的身份连接,则可以轻松完成以下操作:
select * from Metrics
。
不幸的是,以数据库所有者的身份进行连接也意味着我连接的用户可以看到所有表,而不仅仅是Metrics
,还可以更新Metrics
。
我想创建一个新用户lowprivilege
,并拥有dba GRANT SELECT METRICS TO lowprivilege
。
不幸的是,这意味着我必须以低特权身份连接表所有者:
select * from dbo.Metrics
。
在Oracle下,dba如何在不授予表所有者资格的情况下将SELECT授予表?而且,低权限用户除了在所选表中选择之外,没有任何特权。
create view lowprivilege.Metrics as select * from dbo.Metrics
这是有可能的,但是我真的需要保留*
通配符,因为我不知道Metrics中的所有列。另一个问题是,我希望每当dbo.Metrics重建时,我的视图就会中断(这不会经常发生)。
create or replace lowprivilege.Metrics FOR dbo.Metrics
dba可以执行该操作并仅使用此权限授予SELECT吗?至少假定使用Oracle 12版本。
GRANT SELECT METRICS TO lowprivilege
但是,每当lowprivilege
连接时,它都会使用alter session set current_schema=dbo
。请注意,这需要在SQLAlchemy / cx-Oracle下可能。
此外,如果dba可以仅通过DROP USER lowprivilege CASCADE
关闭所有内容,那就太好了。
实现此目标的最佳方法是什么?
答案 0 :(得分:3)
替代#2-创建同义词。这正是同义词的意思。
grant read on dbo.Metrics to lowprivilege;
create or replace synonym lowprivilege.Metrics FOR dbo.Metrics;
注意使用GRANT READ
代替GRANT SELECT
。具有SELECT
特权的用户仍可以锁定表。 READ
特权可以防止这种情况。
答案 1 :(得分:1)
如果应用程序在连接时可以发出如下命令,则可以避免同义词:
alter session set current_schema = HR;
现在,SQL解析器将首先检查HR模式是否存在不合格的对象名称。
您可以创建一个角色并为其授予特权,然后将该角色授予一个或多个应用程序用户帐户,而不是直接向LOWPRIVILEGE
用户授予特权。当有多个用户时,这可以简化操作,并提供一定程度的自我文档记录,因为角色可以具有逻辑名称。
grant read on metrics to readonly;
grant readonly to some_app_account;