powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / имя схемы в триггере
17 сообщений из 17, страница 1 из 1
имя схемы в триггере
    #39587093
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гуру постгреса,

подскажите плиз, могу ли я в триггере на таблицу использовать ту же схему, в которой он создан, без явного указания оной? т.е. в схеме my я создаю таблицу tab, вешаю на неё триггер, в котором обращаюсь, допустим, к таблице tab2, и вот если я вставляю в таблицу tab из другой схемы через insert into my.tab, то в триггере активная схема не my, а та, из под которой я вызываю инсерт. имхо, это тупо, нужно прописывать схему явно в триггере, и при деплое на разные схемы приходится менять имя схемы во всем скрипте вместо одной лишь установки search_path в начале.

подскажите, плиз, как правильно делать.

---------------------------------------
мистер Петя
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39587232
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если вдруг хреново объяснил, то вот пример..

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
drop schema if exists schema1 cascade;
drop schema if exists schema2 cascade;

create schema schema1;
create schema schema2;

set search_path = schema1;

create table tab1(x integer);

create table tab2(x integer);

create function tgr_tab1_ins() returns trigger
as $body$
  begin
    insert into tab2(x) values(new.x);
    return new;
  end
$body$ language plpgsql;

create trigger tgr_tab1_ins
after insert or update on
tab1 for each row
execute procedure tgr_tab1_ins();

insert into tab1(x) values(1);

-- ok

set search_path = schema2;

insert into schema1.tab1(x) values(1);

-- error: relation "tab2" does not exist
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39587259
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот как эту проблему можно решить, не прописывая схему явно в триггере?
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39587260
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bdsm_sql,

Вам надо прыгать от схемы таблицы на которую сработал триггер а не от схемы где функция триггера была.
А это делается через
https://www.postgresql.org/docs/10/static/plpgsql-trigger.html#PLPGSQL-DML-TRIGGER

TG_TABLE_SCHEMA
Data type name; the name of the schema of the table that caused the trigger invocation.
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39587269
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как его использовать? если делаю в триггере
Код: plsql
1.
execute 'set search_path = ' || TG_TABLE_SCHEMA;


то теряется предыдущее значение current_schema.

все запросы в триггере делать в динамике как-то тоже неохота..
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39587306
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bdsm_sqlа как его использовать? если делаю в триггере
Код: plsql
1.
execute 'set search_path = ' || TG_TABLE_SCHEMA;


то теряется предыдущее значение current_schema.

все запросы в триггере делать в динамике как-то тоже неохота..
свитчеваться , не ?
Код: sql
1.
2.
3.
4.
5.
6.
case TG_TABLE_SCHEMA 
when  'a' then 
      --//static sql with a;
when  'b' then 
      --//static sql with Б;
END CASE;
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39587356
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

мне вопрос не в том чтобы триггер создать на обе схемы, а можно ли создать такой триггер вообще без явного указания схемы внутри. получается, никак?
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39587398
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bdsm_sqlqwwq,

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

Триггер который бы несмотря на выставленный search_path ориентировался на схему таблицы где он был вызван?
Динамический SQL для таких задач нужен и по другому не придумывается так как запросы то будут разные при разных схемах на входе.

Можно попробовать сохранять search_path в начале триггера, менять на нужный вам и в конце триггера возвращать назад.
Но игры с search_path в хранимках еще никого до добра не доводили.
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39587420
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bdsm_sql,

Можно для триггерной функции явно прописать seach_path, который она должна использовать.
В вашем примере это будет так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
create function tgr_tab1_ins() returns trigger
as $body$
  begin
    insert into tab2(x) values(new.x);
    return new;
  end
$body$ language plpgsql set search_path = schema1;



По окончании работы функции seach_path автоматически восстанавливается.
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39587549
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bdsm_sqlqwwq,

мне вопрос не в том чтобы триггер создать на обе схемы, а можно ли создать такой триггер вообще без явного указания схемы внутри. получается, никак?
как вы одной и той же разобранной (в плане) до оидов ф--ей обслужите несколько разных таблиц ?

нужно как-то навязать инвалидизацию и переразбор.

//а вообще -- надо на сишные констрейнт--ф--ии посмотреть. параметрические. думается. фк там, к примеру.
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39587564
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq//а вообще -- надо на сишные констрейнт--ф--ии посмотреть. параметрические. думается. фк там, к примеру.
https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/ri_triggers.c#L784
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39587615
PgSQLanonymous3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ЛузановМожно для триггерной функции явно прописать seach_path, который она должна использовать.
...
По окончании работы функции seach_path автоматически восстанавливается.
А ещё удобнее использовать FROM CURRENT:
Код: sql
1.
2.
3.
4.
5.
6.
7.
create function tgr_tab1_ins() returns trigger
as $body$
  begin
    insert into tab2(x) values(new.x);
    return new;
  end
$body$ language plpgsql set search_path FROM CURRENT;
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39588257
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PgSQLanonymous3Павел ЛузановМожно для триггерной функции явно прописать seach_path, который она должна использовать.
...
По окончании работы функции seach_path автоматически восстанавливается.
А ещё удобнее использовать FROM CURRENT:
Код: sql
1.
2.
3.
4.
5.
6.
7.
create function tgr_tab1_ins() returns trigger
as $body$
  begin
    insert into tab2(x) values(new.x);
    return new;
  end
$body$ language plpgsql set search_path FROM CURRENT;



спасибо! то что нужно!

qwwq, я не хочу одну функцию на несколько таблиц, я хочу один раз в начале скрипта поменять схему и задеплоить всю структуру на ещё одну схему и мне не нравится, что имя схемы разбросано по всему скрипту
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39588880
Visermoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PgSQLanonymous3,
Спасибо вам за интересное решение!
Не подскажете где можно в документации про это почитать- всё просмотрел и облазил, но не смог найти упоминания FROM CURRENT;
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39588916
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VisermozPgSQLanonymous3,
Спасибо вам за интересное решение!
Не подскажете где можно в документации про это почитать- всё просмотрел и облазил, но не смог найти упоминания FROM CURRENT;
https://www.postgresql.org/docs/current/static/sql-createfunction.html
авторThe SET clause causes the specified configuration parameter to be set to the specified value when the function is entered, and then restored to its prior value when the function exits. SET FROM CURRENT saves the value of the parameter that is current when CREATE FUNCTION is executed as the value to be applied when the function is entered.
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39589054
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PgSQLanonymous3Павел ЛузановМожно для триггерной функции явно прописать seach_path, который она должна использовать.
...
По окончании работы функции seach_path автоматически восстанавливается.
А ещё удобнее использовать FROM CURRENT:
Код: sql
1.
2.
3.
4.
5.
6.
7.
create function tgr_tab1_ins() returns trigger
as $body$
  begin
    insert into tab2(x) values(new.x);
    return new;
  end
$body$ language plpgsql set search_path FROM CURRENT;



От блин, редкий случай когда показали функциональность про которую я не знал.
Спасибо.
...
Рейтинг: 0 / 0
имя схемы в триггере
    #39589101
Фотография Константин Евтеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пара интересных кейсов с багом инвалидации кэша pg catalog для триггеров
https://www.postgresql.org/message-id/20171030125345.1448.24038@wrigleys.postgresql.org]https://www.postgresql.org/message-id/20171030125345.1448.24038@wrigleys.postgresql.org
https://www.postgresql.org/message-id/CAAqA9PQXEmG=k3WpDTmHZL-VKcMpDEA3ZC06Qr0ASO3oTA7bdw@mail.gmail.com
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / имя схемы в триггере
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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