PostgreSQL-系统表、系统视图

  系统表显示的都是当前操做数据库下的信息,对象都来自当前数据库。由于不一样的系统表都用不一样名的字段来记录不一样对象的oid,这个表引用那个表,那个表又引用另外一个表,因此这些字段名不太好记。web

  pg_class (系统表:对象)是一个对象表,表的每一个字段都是‘rel’开头,分明就是 ‘relation’这个单词的缩写,意思就是‘关系’。中relkind字段决定对象类型:r = 普通表,i = 索引,S = 序列,v = 视图, c = 复合类型,s = 特殊,t = TOAST表。对象所属的relnamespace(模式名称)和relowner(全部者)都是用其对应的oid显示,因此要直观看到实际本名要联合pg_namespace(系统表:模式)pg_roles(系统视图:角色)一块儿查,这两个表和视图中都有oid字段。sql

  以查询对象所属模式及其名称为例:数据库

select relname,relkind,relnamespace,nspname from pg_class c,pg_namespace n where n.oid=16424 and c.relnamespace=n.oid

      relname      | relkind | relnamespace | nspname
-------------------+---------+--------------+---------
 website_pkey      | i       |        16424 | yun
 website           | r       |        16424 | yun
 board_pkey        | i       |        16424 | yun
 board             | r       |        16424 | yun
 spam_keyword_pkey | i       |        16424 | yun
 spam_keyword      | r       |        16424 | yun

  oid数据类型,查询有无单引号均可以。pg_namespace中的oid字段是隐含的,用select * from不能直接查询。架构

select oid,* from pg_namespace

  oid  |      nspname       | nspowner |               nspacl                
-------+--------------------+----------+-------------------------------------
    99 | pg_toast           |       10 |
 11194 | pg_temp_1          |       10 |
 11195 | pg_toast_temp_1    |       10 |
    11 | pg_catalog         |       10 | {postgres=UC/postgres,=U/postgres}
 11469 | information_schema |       10 | {postgres=UC/postgres,=U/postgres}
  2200 | public             |       10 | {postgres=UC/postgres,=UC/postgres}
 16424 | yun               |    16392 |
 16551 | audit              |    16392 |

  PS:逗号实际上是一种起到连结若干列与若干列做用的符号,是一个对查询结果直接产生做用的符号,不是由于查多个字段因此用来分隔为了易读好看的。函数

  pg_namespace有模式的oid,pg_roles有用户的oid。post

  pg_attribute,居然有这么一张表用来记录全部表的字段,神奇。测试

 

  一直有两点疑惑,一是怎么查看视图的定义,二是怎么看一个函数(过程)的定义,也就是对象的实际实现语句,而不是其余属性,视图和函数都是不一样模式下的对象,可是在查询它们的时候都没有受模式的影响。url

  先看视图,以测试建的视图‘test_view1’为例,psql提供了3个视图相关的元命令,可是没有显示具体定义语句的,以后查询了pg_views视图才看到有,这还算是方便的。spa

yun=> \d test_view1 
              视观表 "yun.test_view1"
    栏位    |              型别              | 修饰词 
------------+--------------------------------+--------
 kid        | smallint                       | 
 word       | character varying(255)         | 
 styles     | integer[]                      | 
 cids       | integer[]                      | 
 filter_pos | smallint                       | 
 tm_update  | timestamp(0) without time zone | 

yun=> \dp test_view1 
                        存取权限
 架构模式 |    名称    |  型别  | 存取权限 | 列访问权限 
----------+------------+--------+----------+------------
 yun      | test_view1 | 视观表 |          | 
(1 行记录)

yun=> \dv test_view1 
                 关联列表
 架构模式 |    名称    |  型别  | 拥有者  
----------+------------+--------+---------
 yun    | test_view1 | 视观表 | chen
(1 行记录)

yun=> select * from pg_views where viewname='test_view1'
 schemaname |  viewname  | viewowner |  definition                                                                            
------------+------------+-----------+----------------
 yun        | test_view1 | chen      | SELECT  定义略 ;
(1 行记录)

  再看函数,我直接查了pg_proc表,因为结果都只显示一行而结果第一行都是换行符因此psql在prosrc只显示了\r。另外psql给的2个函数相关的元命令也有用:\df 和 \sf 。code

yun=> select prosrc from pg_proc where proname='thaha'
prosrc -------------------------------------------------------- \r + declare\r + t2_row record;\r + BEGIN\r + select into t2_row gid from board where fid=52163;\r + -- RAISE EXCEPTION 'employee % not found', ooo.name;\r+ return ooo||ooo.url||t2_row.gid;\r + END;\r + (1 行记录)
cyyun=> \df thaha
                       函数列表
 架构模式 | 名称  | 结果资料型别 | 参数资料型别 | 型别 
----------+-------+--------------+--------------+------
 cyyun    | thaha | text         | ooo website  | 常规
(1 行记录)

cyyun=> \sf thaha
CREATE OR REPLACE FUNCTION cyyun.thaha(ooo website)
 RETURNS text
 LANGUAGE plpgsql
AS $function$
略
return ooo||ooo.url||t2_row.gid;
END;
$function$

  thaha是以前随便写的一个测试函数,这里\sf命令不能显示实际执行的SQL,无法直接看到是怎么进行结果的。

  另话,新建视图v2后,把v2的select分配给public,而后drop view v2,再新建同名的view v2,不分配权限,虽然以前分配过同名的v2权限,可是其余用户是没法select新的v2的,说明权限的分配至少和viewname是没有关系的,可能也是跟随oid吧。

相关文章
相关标签/搜索