微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数据库 – 如何隐藏我的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)的名称.

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

原文地址:https://www.jb51.cc/mssql/76207.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐