系統表顯示的都是當前操做數據庫下的信息,對象都來自當前數據庫。由於不一樣的系統表都用不一樣名的字段來記錄不一樣對象的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吧。