当前位置: 首页 > 工具软件 > db2java > 使用案例 >

db2 schema 与java连接

长孙景天
2023-12-01

db2 SQLCODE: -204, SQLSTATE: 42704 解决方法

JDBC访问DB2,路径和用户名,参数正确。但是提示SQLCODE=-204, SQLSTATE=42704。

原因,未指定用户的schema。

 

那么,什么是schema呢?

 

数据库中Schema有两种含义:

一种是概念上的Schema,指的是一组DDL语句集,该语句集完整地描述了数据库的结构。

还有一种是物理上的 Schema,指的是数据库中的一个名字空间,它包含一组表、视图和存储过程等命名对象。简单的说,Schema就是一个(数据库)用户所拥有的数据库的对象。

在一个数据库中可以有多个应用的数据表,这些不同应用的表可以放在不同的schema之中,同时,每一个schema对应一个用户,不同的应用可以以不同的用户连接数据库,这样,一个大数据库就可以根据应用把其表分开来管理。不同的schema之间它们没有直接的关系,不同的shcema之间的表可以同名,也可以互相引用(但必须有权限),在没有操作别的schema的操作根权下,每个用户只能操作它自己的schema下的所有的表。不同的schema下的同名的表,可以存入不同的数据(即schema用户自己的数据).

数据库中的User和Schema到底什么关系呢?其实User就是每个Schema的主人,如果当前操作数据库的用户有默认的Schema(在创建用户的时候指定了),那么新表被创建在默认的Schema上。 通过这样的方法,主要是方便管理。

在DB2中的schema的概念和ORACLE中的概念有着本质的区别:在ORACLE中schema和用户是同一个;在DB2中schema不一定是用户,因为db2内部没有用户的概念,连接用户必须是操作系统用户.

 

 

熟悉Oracle的人都知道Oracle的schema和user是同一个概念;每一个Oracle user就是一个oracle schema。那么DB2的schema和user是不是也是同一个概念呢?

答案是否定的。

 

背景原因

Oracle数据库是数据库本身管理用户的,即每一个要访问Oracle的用户都必须先在Oracle数据库里创建用户;而DB2并没有自己的用户帐号,DB2使用的是操作系统的帐号,DB2只需要对相应的操作系统账户进行授权,则该操作系统账户就可以访问DB2数据库。

DB2数据库几个概念

instance, 同一台机器上可以安装多个DB2 instance。

database, 同一个instance下面可以创建有多个database。

schema, 同一个database下面可以配置多个schema。

所有的数据库对象包括table、view、sequence,etc都必须属于某一个schema。

 

另外,database是一个connection的目标对象,也就是说用户发起一个DB2连接时,指的是连接到到一个database,而不是连接到一个instance,也不是连接到一个schema。

但是DB2的启动和关停是以instance为单位的。可以启动一个instance,或者关停一个instance。但不可以启动或者关停一个数据库或者一个schema。

 

DB2的schema对象和user对象

每一个DB2授权用户都有一个对应的schema,其名字和用户名相同;当然也可以再创建新的schema;这样DB2中user和schema是一种一对多的关系,而Oracle中是一对一的关系。

每一个schema都有一个属主(即所属用户),这个属主在创建scheme的时候指定,如果没有指定值,缺省即当前用户,也就是说谁创建了这个schema,那么这个schema就属于谁。

对于每一个数据库connection,缺省操作都是在其相同用户名的schema下面,除非用户显示的更改了当前schema。

 

 

指定schema的连接语句如下:

public   static void   main(String[] args)   {   
		String   sDBDriver       =   "com.ibm.db2.jcc.DB2Driver";   
		String   sConnDataBase   =   "jdbc:db2://127.0.0.1:50000/TESTRA";     

		Properties properties = new Properties();
		properties.setProperty("user","TEST");
		properties.setProperty("password","198411");
		properties.setProperty("currentSchema","RA");

		Connection   con;   
		    
		Statement   stmt;   
		ResultSet   rs;    
		try   {   
		    Class.forName(sDBDriver);   
		    con   =   DriverManager.getConnection(sConnDataBase, properties);   

		    stmt =   con.createStatement(); 
		    rs    =   stmt.executeQuery("select * from TB_ADMIN");

		    while(rs.next()){
		      System.out.println("F1=" + rs.getString(1)+" "+rs.getString(2)+
		    		  " "+rs.getString(3)+" "+rs.getString(4)+" "+rs.getString(5)+
		    		  " "+rs.getString(6)+" "+rs.getString(7)); 
		    }

		    rs.close();
		    stmt.close();   
		    con.close();   
		    
		} catch(Exception   e)   {   
		    e.printStackTrace();   
		}   
		}  

 

参考链接:

db2中的用户和schema关系是怎样的

https://ask.csdn.net/questions/257584?sort=votes_count

 

db2 SQLCODE: -204, SQLSTATE: 42704的解决方案

https://bbs.csdn.net/topics/320197969?list=lz

 

DB2的schema对象

https://www.jianshu.com/p/e1f38505f789

 

 类似资料: