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吧。

相關文章
相關標籤/搜索