创建同义词是否会自动授予对oracle中基础表的选择访问权限
我在我们的 oracle 数据库中有两个用户 - schema1 和 schema 2。
我在schema1中创建了一个表和同义词如下
创建表测试(用户 varchar2(25));
为 schema1.test 创建或替换同义词 schema2.test
当我尝试从我们的开发和生产环境之间的 schema2 查询测试表时,我观察到了行为的差异。
select * from test
在我们的开发环境中没有抛出任何错误。
但是当我在生产中运行相同的命令时,schema2 的权限不足错误。我必须在生产中将测试表的 select 授予显式授予 schema2。
为什么在开发环境和生产环境之间会出现这种差异?
创建同义词是否会自动授予对 oracle 中基础表的选择访问权限?
回答
不,它没有。从文档:
然而,同义词不能替代数据库对象的特权。在用户可以使用同义词之前,必须向用户授予适当的权限。
假设在您没有意识到或记住的情况下没有直接或通过角色(当然您可以轻松检查)授予表上的特权,听起来schema2在您的开发环境中具有“任何”特权 - 例如select any table- 作为捷径,可能是为了方便。这可以是直接的,也可以是通过角色。
再次来自文档
该
READ ANY TABLE或SELECT ANY TABLE系统权限还允许您从任何表中选择数据,物化视图,分析视图,或层次,或任何物化视图,分析视图,或层级的基表。
不应轻易授予这些特权,因此它们不在生产中出现也就不足为奇了。如果他们必须在开发中 - 并且必须有人同意 - 那么在您尝试部署到生产之前,具有与生产相同限制的中间测试或模型环境将有助于识别差异,例如缺少授权。