postgreSQL

时间:2016-08-10 07:28:44

标签: sql postgresql comments

我一直在尝试找到 SQL 方法来检索我的架构comments以及PostgreSQL中的其他数据库对象。

我在堆栈溢出中看到了以下问题: How to retrieve the comment of a PostgreSQL database?显示如何获取数据库的注释,使用以下代码:

SELECT * FROM pg_shdescription JOIN pg_database ON objoid =
pg_database.oid;

Getting list of table comments in PostgreSQL 它显示了如何获取表的注释,对于模式中的特定表,命令为SELECT obj_description('myschema.mytable'::regclass);

Retrieving Comments from a PostgreSQL DB显示了如何获取数据库中所有列的注释,命令为:

SELECT c.table_schema,c.table_name,c.column_name,pgd.description
FROM pg_catalog.pg_statio_all_tables AS st
INNER JOIN pg_catalog.pg_description pgd ON (pgd.objoid=st.relid)
INNER JOIN information_schema.columns c ON (pgd.objsubid=c.ordinal_position
AND c.table_schema=st.schemaname AND c.table_name=st.relname);

这些评估了从数据库,表和列中获取注释的问题,但它们没有给出其他数据库对象(如模式)的答案。

我已经看了obj_description(object_oid, catalog_name),但没有设法让它工作......用于模式,视图等。

(我主要对模式感兴趣,但由于还有其他情况可能会引起其他开发人员的兴趣,我希望将所有解决方案放在一个地方)。

任何线索?

  

编辑:found架构获取评论的方法...似乎有点   复杂,可能更简单。   这是代码:

SELECT

CASE 
    WHEN nspname LIKE E'pg\_temp\_%' THEN 1 
    WHEN (nspname LIKE E'pg\_%') THEN 0  
    ELSE 3 
END AS nsptyp, nsp.nspname, nsp.oid, pg_get_userbyid(nspowner) 
    AS namespaceowner, 
    nspacl, description,  
    has_schema_privilege(nsp.oid, 'CREATE') as cancreate 
FROM pg_namespace nsp 
LEFT OUTER JOIN pg_description des ON des.objoid=nsp.oid  
WHERE NOT ((nspname = 'pg_catalog' AND EXISTS 
(SELECT 1 FROM pg_class 
    WHERE relname = 'pg_class' 
    AND relnamespace = nsp.oid LIMIT 1)) OR  
(nspname = 'information_schema' AND 
    EXISTS (SELECT 1 FROM pg_class 
            WHERE relname = 'tables' 
            AND relnamespace = nsp.oid LIMIT 1)) OR  
(nspname LIKE '_%' AND 
    EXISTS (SELECT 1 FROM pg_proc 
            WHERE proname='slonyversion' 
            AND pronamespace = nsp.oid LIMIT 1)) OR  
(nspname = 'dbo' AND 
    EXISTS (SELECT 1 FROM pg_class 
            WHERE relname = 'systables' 
            AND relnamespace = nsp.oid LIMIT 1)) OR  
(nspname = 'sys' AND 
    EXISTS (SELECT 1 FROM pg_class 
            WHERE relname = 'all_tables' 
            AND relnamespace = nsp.oid LIMIT 1))
) 
AND nspname NOT LIKE E'pg\_temp\_%'
AND nspname NOT LIKE E'pg\_toast_temp\_%' 
ORDER BY 1, nspname

由于原始代码非常冗长,而且我喜欢简洁的解决方案,所以这里有更好的方法:

SELECT * FROM pg_namespace AS nsp LEFT OUTER JOIN pg_description AS des ON des.objoid=nsp.oid;

长代码基本上排除了PostgreSQL中的一堆模式(虽然我不知道它为什么不能在我的机器上隐藏pg_toast)。

1 个答案:

答案 0 :(得分:1)

好的,经过大量的研究,我得出的结论是,可以使用以下代码来获取PostgreSQL中对象的描述:

SELECT * FROM [pg_catalog_table] AS nsp LEFT OUTER JOIN pg_description AS des ON des.objoid=nsp.oid;

[pg_catalog_table]应该由pg_catalog中包含OID列的表替换...例如(但不限于): pg_type; pg_namespace;等

并使用此代码

SELECT * FROM pg_database AS nsp  LEFT OUTER JOIN pg_shdescription AS sdes ON sdes.objoid=nsp.oid;

来自数据库的描述。

对于视图来说有点棘手,因为它们列在pg_class中,它还列出了其余的对象(这里有更多的工作要做)。

似乎没有对服务器的评论。