Извлечение имени таблицы после установки модуля расширения в postgreSQL? - PullRequest
0 голосов
/ 05 июня 2018

Итак, я занимаюсь разработкой модуля contrib и хочу получить имя таблицы внутри этого модуля contrib.

вопрос:

  1. Есть ли способ записиимя таблицы во время создания таблицы или вставки таблицы?Я видел некоторые из триггеров, но не смог сделать это (я не думаю, что есть какой-либо триггер создания таблицы).В случае, если это возможно, скажите мне, как этого добиться.

  2. Мне кажется, что я извлекаю метаданные с помощью pg_class, но не помогаю, потому что я должен явно дать rel-имя (имя таблицы) в каком пункте, как вы думаете, есть ли другой способ добиться этого?Пожалуйста, уточните, если таковые имеются, и, пожалуйста, дайте мне знать.

Вот несколько примеров, которые помогут вам немного понять, чего я хочу достичь.

создание таблицы:

create table new_table(name varchar , new integer);  
insert into new_table values('abcdefghijkl' , 5004);
create table new_table1(name1 varchar , new1 integer) ;
 insert into new_table1 values('mnopqrst' , 5005);

создание расширения:

create extension table_name-extract;
select extract_tablename();

Таким образом, мое расширение должно извлечь имя таблицы, значит, я должен знать имя таблицы со встроенным типом данных, который я объявил.

Вот что я ожидаю в качестве вывода:

select extract_tablename();

table-name      datatype-name
new_table       name    new
new_table1      name1   new1

1 Ответ

0 голосов
/ 05 июня 2018

Вам не нужно расширение для отслеживания выполнения операторов DDL.

Для этого вы можете использовать триггер события

В руководстве также есть пример о том, как написать триггер события с использованием PL / pgSQL

CREATE OR REPLACE FUNCTION snitch() 
  RETURNS event_trigger 
AS $$
BEGIN
    RAISE NOTICE 'snitch: % %', tg_event, tg_tag;
END;
$$ LANGUAGE plpgsql;

CREATE EVENT TRIGGER snitch ON ddl_command_start 
   EXECUTE PROCEDURE snitch();

Внутри функции триггера вам нужно будет сохранить имя таблицы в некоторой таблице конфигурации, чтобы информация не терялась.

Конечно, вы можете упаковать свой триггер и «таблицу журналов» (как таблица конфигурации ) в расширение, если хотите.


Другой вариант - включить Ведение журнала DDL с использованием

log_statement=ddl 

в postgresql.conf - тогда у вас есть все операторы DDL в файле журнала Postgres.

...