Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггер по событию: добавить триггер на новую таблицу / 4 сообщений из 4, страница 1 из 1
13.07.2017, 15:20
    #39488482
Alewteena1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер по событию: добавить триггер на новую таблицу
Приветствую!
Народ, подскажите пожалуйста, может кто сталкивался...
Необходимо к новой таблице, которую создает внешнее приложение, добавить триггер. Каким образом можно это сделать?
Я решила сделать для этого триггер по событию и функцию для этого триггера, НО... не знаю как получить имя новой таблицы, только что созданной..
Например вот так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR REPLACE FUNCTION new_trig_func()
  RETURNS event_trigger AS
$BODY$
DECLARE
table_name text;
trig_name text;
BEGIN
IF tg_tag='CREATE TABLE' THEN
trig_name =table_name || '_trigger';
CREATE TRIGGER trig_name
  BEFORE DELETE
  ON table_name
  FOR EACH ROW
  EXECUTE PROCEDURE "BlobDel"();
END IF;
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION new_trig_func()
  OWNER TO postgres;


Далее - триггер по событию для этой функции ddl command start
Есть еще сущность information_schema.tables, но как из нее получить новую строчку с именем новой таблицы,я не поняла-(
На нее триггер сделать нельзя походу(а было бы удобно AFTER INSERT и взять NEW.table_name)
...
Рейтинг: 0 / 0
13.07.2017, 16:57
    #39488579
Alewteena1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер по событию: добавить триггер на новую таблицу
Нашла способ через таблицу, в которую пишется имя новой таблицы через триггер события,,,
Теперь сама функция по добавлению триггера выглядит так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION f_insert_newtab1()
  RETURNS trigger AS
$BODY$
DECLARE 
trig_name text;
BEGIN
trig_name=NEW.tname || '_trigger';
CREATE TRIGGER trig_name
  BEFORE DELETE
  ON NEW.tname
  FOR EACH ROW
  EXECUTE PROCEDURE "fclearhistory"();
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION f_insert_newtab1()
  OWNER TO postgres;


Но не работает, так как не может интерпретировать имя таблицы из NEW.tname. Пишет, что схема new не существует. Пробовала делать через переменную table_name(text), но тогда ругается, что нет таблицы table_name. То есть само значение table_name или NEW.tname туда не могу засунуть никак(((
Подскажите кто-нибудь, что можно сделать?
...
Рейтинг: 0 / 0
13.07.2017, 19:23
    #39488665
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер по событию: добавить триггер на новую таблицу
Alewteena1,

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

Обратите внимание, что функция возвращает набор строк, по которым нужно пройтись циклом.
Пример, когда возвращается несколько строк - создание таблицы с первичным ключем.
В этом случае триггер события сработает на CREATE TABLE, а функция вернет одну строку с command_tag='CREATE TABLE' и вторую с command_tag='CREATE INDEX'.

Документация: https://postgrespro.ru/docs/postgresql/9.6/functions-event-triggers.html
...
Рейтинг: 0 / 0
14.07.2017, 09:27
    #39488839
Alewteena1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер по событию: добавить триггер на новую таблицу
Павел Лузанов,
Спасибо за ссылочку, почему-то сама не смогла найти этого, и почти решила уже эту задачу теми вышеописанными методами, остался маленький нюанс, но думаю, что справлюсь
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггер по событию: добавить триггер на новую таблицу / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]