目录
1. DB2数据库中用户的概念
2. DB2中schema的概念
3. 用户与Schema的关系
1. DB2数据库中用户的概念
Oracle和MySQL数据库的用户都是数据库内部的用户,由数据库来管理。
但DB2不一样,DB2没有数据库用户的概念,它依赖于操作系统用户,也就是操作系统上有这个用户,这个用户才可能连接到DB2数据库。连接数据库的命令:
db2 connect to dbname user <username> using <password>
这里的username是一个操作系统的用户,password是指这个系统用户的密码。
2. DB2中Schema的概念
每个DB2的表的完整名子都是由两部分组成 SchemaName.Tablename,没有例外。
如果访问表的时候,不加Schema的名子,就有一个默认的Schema, 比如运行了以下的SQL语句:
db2 "create table a.t1 (id int)"
db2 "create table b.t1 (id int)"
那么就创建了两个表,schema分别是a和b,那么问题来了,如果创建表的时候不指定schema呢?
默认的Schema就是当前用户的用户名,比如当前连接用户是 db2inst1,发出如下SQL
db2 "create table t1(id int)"
那么这个表的schema就是db2inst1
当然,可以使用db2 set current schema来改变当前会话默认的Schema
db2 "set current schema c"
db2 "create table t1(id int)"
这个新建的表的完整表名就是c.t1
使用db2 list tables for all可以看到所有表,如下:
db2inst1@node01:~> db2 "list tables for all" | grep -iw t1
Table/View Schema Type Creation time
------------------------------- --------------- ----- --------------------------
T1 A T 2019-08-23-06.53.18.807936
T1 B T 2019-08-23-06.53.22.671670
T1 C T 2019-08-23-06.53.39.154763
T1 DB2INST1 T 2019-08-23-06.53.29.872110
可以看到有4条表 A.T1, B.T1, C.T1和DB2INST1.T1,如果现在发出命令db2 "select * from t1",那么实际访问的是C.T1,因为前面有发出过命令db2 set current schema c
3. 用户名与Schema的关系
没有必然联系,可能有用户,但没有和用户名一样的Schema。也可能有schema,但没有和Schema一样的用户名。
唯一的联系是,如果访问表的时候不指定schema,默认的Schema是当前连接用户。
————————————————
DB2的schema对象
熟悉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。
DB2 schema相关SQL语句
- CREATE SCHEMA <schema-name> [AUTHORIZATION <schema-owner-name>]
- DROP SCHEMA <schema-name> RESTRICT
- SELECT CURRENT SCHEMA FROM SYSIBM.SYSDUMMY1
- SELECT CURRENT USER FROM SYSIBM.SYSDUMMY1
- SET CURRENT SCHEMA = <schema-name>