PostgreSQL模式详解

 一个PostgreSQL数据库包含一个或多个命名的schema,schema包含表,其它命名的对象,不同模式下面可以有相同的对象名而不会发生冲突。例如:模式A和模式B下面可以各自有T1表。

一个用户可以访问任何模式下面的对象,只要他有权限,有了权限之后,访问的时候加上schema.对象名。PostgreSQL中的模式跟Oracle也都差不多,大同小异,Oracle中也有schema,例如Scott,HR,SYSTEM等等。

schema的作用:
    1). 允许多个用户使用一个数据库而不会干扰其它用户。
    2). 把数据库对象组织成逻辑组,让它们更便于管理。
    3). 第三方的应用可以放在不同的模式中,这样它们就不会和其它对象的名字冲突。

1、public 模式

 每个新创建的数据库下面都有一个默认的Public模式,如果没有创建其他模式,则在创建数据库对象的时候默认使用public模式。在public模式下,所有的用户都必须有public模式的CREATE和USAGE权限。

    

2、编辑schema

2.1、创建schema

    CREATE SCHEMA myschema;

通过以上命令可以创建名字为myschema的模式,在该模式被创建后,其便可拥有自己的一组逻辑对象,如表、视图和函数等。

   创建schema的时候,还可以指定创建相应的表,视图等等

zxydb=# create schema zxyschema1 authorization zxy create table t_zxy_01(a integer) create view v_zxy_01 as select * from t_zxy_01;
CREATE SCHEMA

zxydb=# select * from zxyschema1.t_zxy_01;
 a
---
(0 行记录)

zxydb=# select * from zxyschema1.v_zxy_01;
 a
---
(0 行记录)

创建schema的详情,使用\h create schema

zxydb=# \h alter schema
命令:       ALTER SCHEMA
描述:       更改架构模式的定义
语法:
ALTER SCHEMA 名称 RENAME TO 新的名称
ALTER SCHEMA 名称 OWNER TO { 新的属主 | CURRENT_USER | SESSION_USER }

3、查看当前使用的schema

postgres=# select current_schema();
 current_schema
----------------
 public
(1 行记录)

postgres=# show search_path;
   search_path
-----------------
 "$user", public
(1 行记录)

4、查看当前数据库有多少schema

zxydb=# \dn+
                              架构模式列表
    名称     |  拥有者  |       存取权限       |          描述
-------------+----------+----------------------+------------------------
 public      | postgres | postgres=UC/postgres+| standard public schema
             |          | =UC/postgres         |
 zxyschema   | zxy      |                      |
 zxyschema_1 | zxy      |                      |
(3 行记录)

5、修改schema的名称

zxydb=# alter schema zxyschema1 rename to zxyschema_1;
ALTER SCHEMA
zxydb=# \dn+
                              架构模式列表
    名称     |  拥有者  |       存取权限       |          描述
-------------+----------+----------------------+------------------------
 public      | postgres | postgres=UC/postgres+| standard public schema
             |          | =UC/postgres         |
 zxyschema   | zxy      |                      |
 zxyschema_1 | zxy      |                      |
(3 行记录)

6、修改schema的owner

zxydb=# \h alter schema
命令:       ALTER SCHEMA
描述:       更改架构模式的定义
语法:
ALTER SCHEMA 名称 RENAME TO 新的名称
ALTER SCHEMA 名称 OWNER TO { 新的属主 | CURRENT_USER | SESSION_USER }

详细修改schema查看\h alter schema

zxydb=# \h alter schema
命令:       ALTER SCHEMA
描述:       更改架构模式的定义
语法:
ALTER SCHEMA 名称 RENAME TO 新的名称
ALTER SCHEMA 名称 OWNER TO { 新的属主 | CURRENT_USER | SESSION_USER }

6、访问模式和权限

查看当前模式下的表

zxydb=# \d
             关联列表
 架构模式 | 名称 |  类型  | 拥有者
----------+------+--------+--------
 public   | test | 数据表 | zxy
(1 行记录)

zxydb=# select * from test;
 a1
----
(0 行记录)
查看不同模式下的表
zxydb=# select * from zxyschema_1.t_zxy_01;
 a
---
(0 行记录)

如果想查看数据库中所有的表,可以查看pg_tables

注意:用户访问不同模式的时候,不仅需要授权,还需要有usage权限.

grant all on schema.table to A;

grant usage on schema to A;  

7、删除模式

zxydb=# drop schema zxyschema;

如果要删除模式及其所有对象,请使用级联删除:
DROP SCHEMA zxyschema CASCADE;
    
8、模式搜索路径:
    我们在使用一个数据库对象时可以使用它的全称来定位对象,然而这样做往往也是非常繁琐的,每次都不得不键入owner_name.object_name。PostgreSQL中提供了模式搜索路径,这有些类似于Linux中的$PATH环境变量,当我们执行一个Shell命令时,只有该命令位于$PATH的目录列表中,我们才可以通过命令名直接执行,否则就需要输入它的全路径名。PostgreSQL同样也通过查找一个搜索路径来判断一个表究竟是哪个表,这个路径是一个需要查找的模式列表。在搜索路径里找到的第一个表将被当作选定的表。如果在搜索路径中 没有匹配表,那么就报告一个错误,即使匹配表的名字在数据库其它的模式中存在也如此。
    在搜索路径中的第一个模式叫做当前模式。除了是搜索的第一个模式之外,它还是在CREATE TABLE没有声明模式名的时候,新建表所属于的模式。要显示当前搜索路径,使用下面的命令:
 zxydb=SHOW search_path;
      search_path
    ----------------
     "$user",public
    (1 row)
 可以将新模式加入到搜索路径中,如:
 SET search_path TO zxyschema,public;
 为搜索路径设置指定的模式,如:
 SET search_path TO zxyschema;--当前搜索路径中将只是包含zxyschema一种模式。

猜你喜欢

转载自blog.csdn.net/qq_31943653/article/details/76630695