В качестве текущего проекта мне было поручено комментировать все в базе данных postgres, тем самым документируя все объекты и то, что они делают. Есть ли скрипт SELECT
, который бы показывал все таблицы, представления, столбцы, функции и т. д., а также их комментарии, в том числе с нулевыми комментариями. Ниже приведен пример того, что мне нужно:
SELECT object_type,object_schema,object_name,comment
FROM information_schema.some_table_out_there;
|object_type|object_schema|object_name|comment|
|table | my_schema |table1 |my first table
|table | my_schema |table2 |NULL
|view | public |employees |NULL
|function | public |emps_insert|inserts employees
Я хотел бы использовать этот сценарий для создания отчета, в котором вы переходите к форме и комментируете объект базы данных желаемым комментарием.
information_schema
определяется Стандарт ANSI, поэтому он охватывает только объекты, описанные в спецификации SQL. Индексы не включены, как и ничего специфичного для Postgres (триггеры событий, политики безопасности строк и т. д.). Если вам нужен исчерпывающий список, вам нужно перейти к системные каталоги.
Нет центрального списка объектов; каждый тип объекта находится в своей собственной таблице, поэтому вам нужно запрашивать каждый из них отдельно. Однако есть несколько удобных информационные функции объекта, которые принимают любой тип объекта, поэтому мы можем довольно легко склеить эти запросы вместе с помощью некоторого динамического SQL:
create function describe_all_objects()
returns table(
type text,
schema text,
name text,
identity text,
comment text
)
as $$
declare
/* Cutoff for system object OIDs; see comments in src/include/access/transam.h */
MIN_USER_OID constant oid = 16384;
catalog_class regclass;
begin
for catalog_class in
/* Get a list of all catalog tables with an OID */
select oid::regclass
from pg_class
where
relhasoids and
pg_class.oid < MIN_USER_OID and
/* Enum members have no obj_description(); the enum itself is picked up in pg_type */
pg_class.oid <> 'pg_enum'::regclass
loop
return query execute format(
$SQL$
/* Get descriptions for all user-created catalog entries */
select
info.type,
info.schema,
info.name,
info.identity,
coalesce(
obj_description(catalog_table.oid, catalog_table.tableoid::regclass::text),
shobj_description(catalog_table.oid, catalog_table.tableoid::regclass::text)
) as comment
from
%s as catalog_table,
lateral pg_identify_object(catalog_table.tableoid, catalog_table.oid, 0) as info
where
catalog_table.oid >= %s
$SQL$,
catalog_class,
MIN_USER_OID
);
end loop;
/* Handle "sub-objects" (i.e. pg_attribute) separately */
return query
select
info.type,
info.schema,
info.name,
info.identity,
col_description(attrelid, attnum) as comment
from
pg_attribute,
lateral pg_identify_object('pg_class'::regclass, attrelid, attnum) as info
where
attrelid >= MIN_USER_OID and
attnum >= 0 and
not attisdropped;
end
$$
language plpgsql stable;
select * from describe_all_objects();
Это должно охватывать объект каждый в базе данных, вплоть до неявных типов массивов таблиц и столбцов в индексах таблиц TOAST, а также объекты на уровне сервера, такие как базы данных и пользователи, поэтому вы, вероятно, захотите отфильтровать это довольно сильно. кусочек.
Некоторым таблицам каталога требуется разрешение суперпользователя для прямого доступа, но если это проблема, вы должны иметь возможность изменять запросы, чтобы получать информацию из какого-либо общедоступного источника (например, pg_authid
доступен только суперпользователю, поскольку он содержит информацию о пароле, но вы вместо этого можно посмотреть pg_roles
).
Дайте мне знать, если заметите какие-либо упущения (и, пожалуйста, проверьте это более тщательно, чем я, прежде чем использовать его для чего-то важного :)).
Это может помочь вам начать работу stackoverflow.com/questions/769683/show-tables-in-postgresql