最近在测试代码的时候遇到了一件事,花费了不少脑力。
在Java代码中DatabaseMetaData类的getColumns方法(参照http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#getColumns(java.lang.String,%20java.lang.String))获取Test表的所有列信息。然后恰好在我的Oracle数据库中我曾经通过system用户添加了这个Test表,然后偶尔发现system作为一个超级用户不应该轻易拿出来操作,而且system用户(其实是schema,后面谈)下有很多系统表,看起来很是凌乱。然后我新建了用户hello,然后为了省事我从system下面复制了Test表到hello用户下。这就是背景。
然后在使用getColumns方法的时候就这样使用了getColumns(null,"Test");。然后发现取到的值是每个列都有一条重复的数据。经过研究发现,我们应该在getColumns方法的第二个参数中添加对应的schema用来确定正在操作的schema。问题就来了,以前从来想过这个schema到底是个什么玩意,这会懵逼了,然后就有了这篇博客。
下面就是正题。
关于Oralce数据库中user和schema的的关系,参照 https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6162110256950 user就是一个用户,我们可以直接理解为他就是我们登录时使用的那个字符串;而schema则是和这个用户对应的所有对象的集合(Objects or Collections),具体在程序开发过程中schema名等于user名。 例如一个简单的查询语句select * from abc.test 这里的abc就是schema名,而不是user,尽管它俩个总是看起来难于区别。