триггер события postgres и функция не работают - PullRequest
0 голосов
/ 26 апреля 2018

Я искал триггер события, который сработал после создания таблицы. Я нашел здесь несколько хороших постов и провел несколько тестов. Моя проблема в том, что ничего не происходит, ни ошибок, ни вывода. Поэтому, пожалуйста, дайте несколько советов, что я делаю неправильно. Вот мой код. Я новичок в postgres, пришёл от oracle, поэтому, пожалуйста, прости меня за этот, возможно, «простой» вопрос.

create table createt (tname char(20));

CREATE OR REPLACE FUNCTION insert()
RETURNS event_trigger
AS $$
DECLARE r RECORD;
BEGIN
r := pg_event_trigger_ddl_commands();
INSERT INTO createt VALUES(r.object_identity);
END;
$$
LANGUAGE plpgsql;

CREATE EVENT TRIGGER insert_event ON ddl_command_end
WHEN TAG IN ('CREATE TABLE')
EXECUTE PROCEDURE insert();

Итак, в этом тестовом примере я хочу поместить имя таблицы вновь созданной таблицы в таблицу createt! Но ничего не происходит. Как я могу проверить, сработал ли триггер. Или как я могу отладить функцию?

Спасибо за ваше время и советы.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

спасибо за ваш совет. Очень хорошее объяснение о наборе строк для object_identity. Но почему в таблице есть 4 строки. Я ожидал бы 3 (имя таблицы, имя первичного ключа, имя_индекса). Почему происходит вставка «my_table_id_seq» два раза?

Итак, я использовал ваш код, чтобы попробовать его для меня, но теперь я получаю сообщение об ошибке, что функция pg_event_trigger_ddl_commands не существует!

marcel=# DROP TABLE createt;
FEHLER:  Tabelle »createt« existiert nicht
marcel=# CREATE TABLE createt (tname text);
CREATE TABLE
marcel=#
marcel=# CREATE OR REPLACE FUNCTION insert()
marcel-# RETURNS event_trigger
marcel-# AS $$
marcel$# BEGIN
marcel$# INSERT INTO createt
marcel$# SELECT object_identity
marcel$# FROM pg_event_trigger_ddl_commands();
marcel$# END;
marcel$# $$
marcel-# LANGUAGE plpgsql;
CREATE FUNCTION
marcel=# CREATE EVENT TRIGGER insert_event ON ddl_command_end
marcel-# WHEN TAG IN ('CREATE TABLE')
marcel-# EXECUTE PROCEDURE insert();
CREATE EVENT TRIGGER
marcel=#
marcel=#
marcel=# create table my_table(id serial primary key);
FEHLER:  Funktion pg_event_trigger_ddl_commands() existiert nicht
ZEILE 3: FROM pg_event_trigger_ddl_commands()
              ^
TIP:  Keine Funktion stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen.
ANFRAGE:  INSERT INTO createt
SELECT object_identity
FROM pg_event_trigger_ddl_commands()
KONTEXT:  PL/pgSQL-Funktion insert() Zeile 3 bei SQL-Anweisung
marcel=#
marcel=# select * from createt;
 tname
-------
(0 Zeilen)
0 голосов
/ 26 апреля 2018

Функция pg_event_trigger_ddl_commands() возвращает набор строк. Функция триггера должна быть готова принять более одной строки, например ::10000

CREATE OR REPLACE FUNCTION insert()
RETURNS event_trigger
AS $$
BEGIN
    INSERT INTO createt 
    SELECT object_identity
    FROM pg_event_trigger_ddl_commands();
END;
$$
LANGUAGE plpgsql;

char(20) недостаточно для object_identity, используйте text:

DROP TABLE createt;
CREATE TABLE createt (tname text);

Что происходит при создании таблицы с серийным первичным ключом?

create table my_table(id serial primary key);

Давайте проверим:

select *
from createt

         tname          
------------------------
 public.my_table_id_seq
 public.my_table
 public.my_table_pkey
 public.my_table_id_seq
(4 rows)    

В последовательности есть два действия: сначала создать ее, а другое установить owned by с помощью alter sequence.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...