关系型数据库都有模式的定义,模式的存在是为了更便于管理众多数据库对象,有为数据库对象分组的意思,HGDB数据库中的模式也是如此,一个数据库可以存在多个模式,创建的数据库对象都会隶属于某个模式,同一个数据库不同的模式下面的对象可以重名,默认的模式是public,下面通过一个实验来理解模式在HGDB中的表现。
1.利用超级用户highgo创建数据库testdb
CREATE DATABASE testdb;
2.用user_t登录到testdb数据库,查看testdb数据库中的所有模式:
\c testdb user_t
\dn;
List of schemas
Name | Owner
----------------+--------
hgdb_catalog | highgo
oracle_catalog | highgo
public | highgo
(3 rows)
显示结果有默认有3个模式,一般用户使用public这个模式,其它两个系统调用。
3.创建一张测试表
CREATE TABLE test(id integer not null);
4.查看当前数据库的模式列表:
\d; --如果没有刚创建的表的显示,因为模式路径中没有包含表对象的模式,需要设置
select * from pg_tables where tablename='test'; --可查看到刚创建的表
显示结果是表test属于模式public.也就是test表被默认创建在了public模式中。
5.创建一个新模式schema_t,对应于登录用户user_t:
CREATE SCHEMA schema_t OWNER user_t;
6.再次创建一张test表,这次这张表要指明模式
CREATE TABLE schema_t.test (id integer not null);
7.查看新创建的表信息:
\d;
List of relations
Schema | Name | Type | Owner
----------------+------+-------+--------
oracle_catalog | dual | view | highgo
schema_t | test | table | user_t
(2 rows)
注意:通过\d显示表存在对象可见性的问题,如果看不到新建的表test,需要先执行
set schema 'schema_t'; (会话级别!)
或者
set search_path=schema_t; (会话级别!)
ALTER database "testdb" SET search_path = schema_t; (数据库级别,需要重新登录)
显示结果是表test属于模式schema_t。也就是这个test表被创建在了schema_t模式下。
结论:
1.数据库是被模式(schema)来切分的,一个数据库至少有一个模式,所有数据库内部的对象(object)是被创建于模式的。
2.用户登录到系统,连接到一个数据库后,是通过该数据库的search_path来寻找schema的搜索顺序,可以通过SHOW search_path;
查看的模式搜索的顺序,也可以通过以下命令修改模式搜索顺序。
SET search_path TO 'schema_name'; (会话级,新建会话失效)
ALTER database "dbname" SET search_path = schema_name; (数据库级别,需要重新登录)
官方建议:
在管理员创建一个具体数据库后,应该为所有可以连接到该数据库的用户分别创建一个与用户名相同的模式,然后,将search_path设置为”$user”。
这样,任何当某个用户连接上来后,会默认将查找或者定义的对象都定位到与之同名的模式中。