数据库 – 如何隐藏我的Oracle表?

这是场景(简化示例):

我有一个名为ABC的Oracle用户/架构. ABC拥有一张叫做TRN的桌子.客户端代码以ABC形式连接到数据库,并从ABC.TRN中选择.

到现在为止还挺好.但是,我不希望客户端代码指定Oracle模式名称.现在我想我已经删除了引用模式的客户端代码中的所有引用,但我想测试它以确保.

所以我想创建一个名为DEF的新用户/模式,客户端将使用它来连接数据库.当客户端应用程序从ABC.TRN中选择时,它必须给出错误.但是,如果客户端应用程序从TRN(无模式名称)中选择,则它必须返回数据.

有办法做到这一点吗?请注意,DEF必须与ABC在同一个数据库中,只有一个表TRN表(由ABC拥有),我不能使用数据库链接.

我尝试创建一个新的XYZ用户,其同义词指向ABC.TRN并赋予它对ABC.TRN的选择权限.然后我创建了DEF用户,其同义词指向XYZ.TRN,并且给予DEF对XYZ.TRN的选择权限.这很有效但是Oracle很聪明地知道如果DEF有权从XYZ.TRN中选择,那么它也有权从ABC.TRN中进行选择,从而违背了本练习的目的,因为我希望这个案例给出错误.

给你…

解决方法

没有简单的方法可以做到这一点.

一种方法是政治性的:机构代码审查,也许是对代码库的自动搜索,并且当人们这样做时只是拍手腕.

架构方法类似于您的三种架构结构,但有一个微妙的转折:中间的架构使用视图.因此,模式ABC拥有表并授予它们对模式XYZ的权限. Schema XYZ针对这些表构建简单视图(SELECT *,没有WHERE子句),并将视图权限授予模式DEF. Schema DEF只能从XYZ对象中选择.

当然,所有这些努力仍然不会阻止开发人员编写SELECT * FROM xyz.whatever.在这种情况下,我推荐你的第一个建议8-)

实际上有一种,真的很邪恶的方式来做到这一点.在面向架构的应用程序(DEF)中使用同义词,然后更改数据拥有架构(ABC)的名称.

当然,如果您的安装脚本完全是参数化的,并且没有自己的硬编码模式名称,那么您应该只尝试此策略.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...