postgres db

系统表与系统视图

一、pg_class:

该系统表记录了数据表、索引(仍然需要参阅pg_index)、序列、视图、复合类型和一些特殊关系类型的元数据。注意:不是所有字段对所有对象类型都有意义。 

见如下应用示例:

查看指定表对象testtable的模式

postgres=# SELECT relname,relnamespace,nspname FROM pg_class c,pg_namespace n WHERE relname = 'testtable' AND relnamespace = n.oid;
  relname   | relnamespace | nspname
-------------+--------------+---------
 testtable   |         2200    | public
(1 row)
#查看指定表对象testtable的owner(即role)。
postgres=# select relname,rolname from pg_class c,pg_authid au where relname = 'testtable' and relowner = au.oid;
  relname   | rolname
-------------+----------
 testtable   | postgres
(1 row)

二、pg_attribute:

该系统表存储所有表(包括系统表,如pg_class)的字段信息。数据库中的每个表的每个字段在pg_attribute表中都有一行记录。

见如下应用示例:

查看指定表中包含的字段名和字段编号。

postgres=# SELECT relname, attname,attnum FROM pg_class c,pg_attribute attr WHERE relname  = 'testtable' AND c.oid = attr.attrelid;
  relname   | attname  | attnum
-------------+----------+--------
 testtable   | tableoid   |     -7
 testtable   | cmax       |     -6
 testtable   | xmax      |     -5
 testtable   | cmin       |     -4
 testtable   | xmin       |     -3
 testtable   | ctid         |     -1
 testtable   | i             |      1
(7 rows)
#只查看用户自定义字段的类型
postgres=# SELECT relname,attname,typname FROM pg_class c,pg_attribute a,pg_type t WHERE c.relname = 'testtable' AND c.oid = attrelid AND atttypid = t.oid AND attnum > 0;
  relname   | attname  | typname
-------------+----------+---------
 testtable   | i             | int4
(7 rows)

三、pg_attrdef:

该系统表主要存储字段缺省值,字段中的主要信息存放在pg_attribute系统表中。注意:只有明确声明了缺省值的字段在该表中才会有记录。

见如下应用示例:

查看指定表有哪些字段存在缺省值,同时显示出字段名和缺省值的定义方式

postgres=# CREATE TABLE testtable2 (i integer DEFAULT 100);
CREATE TABLE         
postgres=# SELECT c.relname, a.attname, ad.adnum, ad.adsrc FROM pg_class c, pg_attribute a, pg_attrdef ad WHERE relname = 'testtable2' AND ad.adrelid = c.oid AND adnum = a.attnum AND attrelid = c.oid;
  relname    | attname | adnum  | adsrc
-------------+----------+---------+-------
 testtable2  | i            |         1  | 100
(1 row)

四、pg_authid:

该系统表存储有关数据库认证的角色信息,在PostgreSQL中角色可以表现为用户和组两种形式。对于用户而言只是设置了rolcanlogin标志的角色。由于该表包含口令数据,所以它不是公共可读的。PostgreSQL中提供了另外一个建立在该表之上的系统视图pg_roles,该视图将口令字段填成空白。

见如下应用示例:

从输出结果可以看出口令字段已经被加密。

postgres=# SELECT rolname,rolpassword FROM pg_authid;
 rolname  |             rolpassword
-----------+-------------------------------------
 postgres | md5a3556571e93b0d20722ba62be61e8c2d

五、pg_auth_members:

该系统表存储角色之间的成员关系。

见如下应用示例:

1. 先查看角色成员表中有哪些角色之间的隶属关系,在当前结果集中只有一个成员角色隶属于一个组角色,

#    如果有多个成员角色隶属于同一个组角色,这样将会有多条记录。
postgres=# SELECT * FROM pg_auth_members ;
 roleid  | member | grantor | admin_option
--------+--------+---------+--------------
  16446 |  16445  |      10   | f
(1 row)
#2. 查看组角色的名字。
postgres=# SELECT rolname FROM pg_authid a,pg_auth_members am WHERE a.oid = am.roleid;
 rolname
---------
 mygroup
(1 row)
#3. 查看成员角色的名字。
#4. 如果需要用一个结果集获取角色之间的隶属关系,可以将这两个结果集作为子查询后再进行关联。
postgres=# SELECT rolname FROM pg_authid a,pg_auth_members am WHERE a.oid = am.member;
 rolname
---------
 myuser
(1 row)

六、pg_constraint:

该系统表存储PostgreSQL中表对象的检查约束、主键、唯一约束和外键约束。

七、pg_tablespace:

该系统表存储表空间的信息。注意:表可以放在特定的表空间里,以帮助管理磁盘布局和解决IO瓶颈。

见如下应用示例:

1. 创建表空间。

postgres=# CREATE TABLESPACE my_tablespace LOCATION '/opt/PostgreSQL/9.1/mydata';
CREATE TABLESPACE
#2. 将新建表空间的CREATE权限赋予public。
postgres=# GRANT CREATE ON TABLESPACE my_tablespace TO public;
GRANT
#3. 查看系统内用户自定义表空间的名字、文件位置和创建它的角色名称。
#4. 系统创建时自动创建的两个表空间(pg_default和pg_global)的文件位置为空(不是NULL)。
postgres=# SELECT spcname,rolname,spclocation FROM pg_tablespace ts,pg_authid a WHERE ts.spcowner = a.oid AND spclocation <> '';
    spcname    | rolname  |        spclocation
---------------+----------+----------------------------
 my_tablespace | postgres | /opt/PostgreSQL/9.1/mydata
(1 row)

八、pg_namespace:

该系统表存储名字空间(模式)。

见如下应用示例:

查看当前数据库public模式的创建者的名称。

postgres=# SELECT nspname,rolname FROM pg_namespace n, pg_authid a WHERE nspname = 'public' AND nspowner = a.oid;
 nspname | rolname
----------+----------
 public    | postgres
(1 row)

九、pg_database:

该系统表存储数据库的信息。和大多数系统表不同的是,在一个集群里该表是所有数据库共享的,即每个集群只有一份pg_database拷贝,而不是每个数据库一份。

十、pg_index:

该系统表存储关于索引的一部分信息。其它的信息大多数存储在pg_class。

见如下应用示例:

查看该索引所在表的名称,以及构成该索引的键值数量和具体键值的字段编号。

postgres=# SELECT indnatts,indkey,relname FROM pg_index i, pg_class c WHERE c.relname = 'testtable2' AND indrelid = c.oid;
 indnatts | indkey |  relname
----------+--------+------------
        2 | 1 3    | testtable2
(1 row)
#查看指定表包含的索引,同时列出索引的名称。
postgres=# SELECT t.relname AS table_name, c.relname AS index_name FROM (SELECT relname,indexrelid FROM pg_index i, pg_class c WHERE c.relname = 'testtable2' AND indrelid = c.oid) t, pg_index i,pg_class c WHERE t.indexrelid = i.indexrelid AND i.indexrelid = c.oid;
 table_name |   index_name
------------+----------------
 testtable2 | testtable2_idx
(1 row)----------------------------------------------------------------------

系统视图

一、pg_tables:

该视图提供了对有关数据库中每个表的有用信息地访问。

二、pg_indexes:

该视图提供对数据库中每个索引的有用信息的访问。

三、pg_views:

该视图提供了对数据库里每个视图的有用信息的访问途径。

四、pg_user:

该视图提供了对数据库用户的相关信息的访问。 这个视图只是pg_shadow表的公众可读的部分的视图化,但是不包含口令字段。

五 pg_roles:

该视图提供访问数据库角色有关信息的接口。这个视图只是pg_authid表的公开可读部分的视图化,同时把口令字段用空白填充。

六、pg_rules:

该视图提供对查询重写规则的有用信息访问的接口。

七、pg_settings:

该视图提供了对服务器运行时参数的访问。它实际上是SHOW和SET命令的另外一种方式。它还提供一些用SHOW不能直接获取的参数的访问,比如最大和最小值。

留言

您的邮箱地址不会被公开。 必填项已用 * 标注