专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > DB2

DB2中两个不同的用户建相同的表名怎么实现

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
DB2中两个不同的用户建相同的表名如何实现
因应用实现需要在一个数据库中创建两个用户(user1,user2),两个用户下分别建相同的表(tab1),
在数据库连接时,用user1连接,即访问user1下的tab1表数据,用user2连接时,即访问user2下的tab1表。


请问能否实现以上需求呢?

如果用schema实现,则需要写成select * from user1.tab1  这样的语句,
不能做到通过切换数据库联接即实现访问不同的物理数据表的方法。
因此这个方法不能接受。
------解决思路----------------------
用户登录后,创建数据表时不指定schema,那么表模式会默认是用户名,查询是不指定模式名也会默认使用当前用户名为模式名。
------解决思路----------------------
DB2数据库用户就是操作系统里面的一个用户,在DB2里面有Schema(模式)的概念,当你通过不同的数据库用户连接到数据库里面的时候这个数据库用户的模式名就是用户名.

先创建操作系统用户
.......
使用当前实例账户连接数据库
#db2 connect to dbname 
给刚刚创建的用户受数据库连接权限(根据需求进行授权)
#db2 grant connect on database to user test
断开连接
#db2 connect reset
使用刚刚创建的账户登录
#db2 connect to dbname user test using password

说明:不同数据账户登录并创建的表就属于谁的,查询的时候就不用通过Schema加点符号再加表名.如:Schema.tablename.

你可以使用SQuirrel客户端工具连接进去看,可以看到详细的Schema对应的数据内容.
------解决思路----------------------
一个SCHEMA下不能有同名Database Objects,无论是建同名的表或者View都不行。

如果必须使用同名表,而且现在是针对不同用户,貌似只能通过在不同的Schema上建立同名表来达到要求,具体执行的时候如果必须省略schema名字,可以用SET CURRENT SCHEMA语句来达到切换当前SCHEMA的效果。

但是!!无论如何,重名数据库表是BAD DESIGN,就是数据库表不应该如此设计。无论你什么应用,都可以通过使用不同名表来达到。楼主不妨简单说明为什么需要在一个SCHEMA下同名表不可。

从字面的需求,不同用户登录进来使用不同的密码,访问同名表而不需要特别指定SCHEMA名的假设在实战中应该不成立,可以避免。

如果你想隐藏真实的SCHEMA名,可以采用建立不同的别名,同时在别名上设置访问权限就好了,这样SCHEMA的别名可以针对不同的用户群有不同的设置,而内部真实的数据库SCHEMA不至于暴露出去,一定程度上达到Multi-Tenant的功能。

必须指出的是,无论是DB2,Oracle还是MS SQL Server,都没有真正意义上的实现Multi-Tenancy,现在的云数据库可以差不多可以,就是实现不同层次的多独立用户共享一个Database Object而相互不影响。

理想状态的Multitanency应该是可以做到:
一,.多个用户分离独立使用数据库。 (现在数据库都可以多用户,现在DB2做得到)
二,多个用户分别独立使用一个数据库实例(就是share DB2 Instance,现在DB2做得到)
三,多个用户分别独立使用一个数据库SCHEMA。 (现在DB2做得到,通过设置同SCHEMA下不同Database object的访问权限可以做到)
四,多个用户分别独立使用一个表,视图。(这个目前DB2还做不到,你不可能用过DBA来设置一部分用户可以使用某个表的某一部分,而别的用户只能使用同表的另一部分。而相互不影响彼此操作。

有意思,看似简单的一个问题,其实有不少奥妙。

:-)
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: