SQL 访问 postgre 中的评论SQL
SQL access comments in postgreSQL
我一直在努力寻找一种 SQL 方法来检索 comments 我的 schemas 和 PostgreSQL.
中的其他数据库对象
我在stackoverflow中看到了以下问题:
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
它显示了如何获取 tables 的评论,命令是 SELECT obj_description('myschema.mytable'::regclass);
用于架构中的特定 table。
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);
这些评估从数据库、tables 和列中获取评论的问题,但它们没有给出其他数据库对象(例如模式)的答案。
我已经看过 obj_description(object_oid, catalog_name) 但没能成功...对于模式、视图等
(我主要对模式感兴趣,但由于其他开发人员可能会感兴趣的其他情况,我希望将所有解决方案集中在一个地方)。
有什么线索吗?
EDIT: found a way to get the comments from schemas... Seems a bit
complicated, could be simplier.
Here is the code:
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;
长代码基本上排除了Postgre中的一堆模式SQL(虽然我不知道为什么它不隐藏pg_toast在我的机器上)
好的,经过大量研究,我得出的结论是可以使用以下代码来获取 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 中的 table 替换,其中包含一个 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 中列出,其中还列出了其余对象(此处还有更多工作要做)。
服务器好像没有评论。
我一直在努力寻找一种 SQL 方法来检索 comments 我的 schemas 和 PostgreSQL.
中的其他数据库对象我在stackoverflow中看到了以下问题: 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
它显示了如何获取 tables 的评论,命令是 SELECT obj_description('myschema.mytable'::regclass);
用于架构中的特定 table。
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);
这些评估从数据库、tables 和列中获取评论的问题,但它们没有给出其他数据库对象(例如模式)的答案。
我已经看过 obj_description(object_oid, catalog_name) 但没能成功...对于模式、视图等
(我主要对模式感兴趣,但由于其他开发人员可能会感兴趣的其他情况,我希望将所有解决方案集中在一个地方)。
有什么线索吗?
EDIT: found a way to get the comments from schemas... Seems a bit complicated, could be simplier. Here is the code:
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;
长代码基本上排除了Postgre中的一堆模式SQL(虽然我不知道为什么它不隐藏pg_toast在我的机器上)
好的,经过大量研究,我得出的结论是可以使用以下代码来获取 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 中的 table 替换,其中包含一个 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 中列出,其中还列出了其余对象(此处还有更多工作要做)。
服务器好像没有评论。