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

前端之家收集整理的这篇文章主要介绍了数据库 – 如何隐藏我的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)的名称.

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

猜你在找的MsSQL相关文章