powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / создание триггера
8 сообщений из 8, страница 1 из 1
создание триггера
    #33148705
puzzle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
помогите, необходимо создать триггер на вставку в базу, чтобы в одно значение подставлял значение из другой таблице.
Код: plaintext
1.
2.
3.
4.
DROP TRIGGER "new_trigger" ON "public"."RIM_TOD";

CREATE TRIGGER "new_trigger" BEFORE INSERT 
ON "public"."RIM_TOD" FOR EACH ROW 
EXECUTE PROCEDURE "public"."RIM_INS"();

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE FUNCTION "public"."RIM_INS" () RETURNS trigger AS
$body$
begin
  insert into "RIM_TOD" ("INSTR")  SELECT "TICKER" FROM "NAME_INSTR" WHERE "NAME" = new."NAME"
  return NEW;
end;
$body$
LANGUAGE 'sql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER;

что тут неправильно, и как обращаться к вставляемой записи?
Заранее благодарен, Павел.
...
Рейтинг: 0 / 0
создание триггера
    #33148716
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
puzzle wrote:
> помогите, необходимо создать триггер на вставку в базу, чтобы в одно
> значение подставлял значение из другой таблице.
>
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
  CREATE OR REPLACE FUNCTION "public"."RIM_INS" () RETURNS trigger AS
  $body$
  begin
    NEW.INSTR := "TICKER" FROM "NAME_INSTR" WHERE "NAME" = new."NAME";
    return NEW;
  end;
  $body$
  LANGUAGE 'plpgsql' ;

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
создание триггера
    #33148726
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
puzzleпомогите, необходимо создать триггер на вставку в базу, чтобы в одно значение подставлял значение из другой таблице.
Код: plaintext
1.
2.
3.
4.
DROP TRIGGER "new_trigger" ON "public"."RIM_TOD";

CREATE TRIGGER "new_trigger" BEFORE INSERT 
ON "public"."RIM_TOD" FOR EACH ROW 
EXECUTE PROCEDURE "public"."RIM_INS"();

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE FUNCTION "public"."RIM_INS" () RETURNS trigger AS
$body$
begin
  insert into "RIM_TOD" ("INSTR")  SELECT "TICKER" FROM "NAME_INSTR" WHERE "NAME" = new."NAME"
  return NEW;
end;
$body$
LANGUAGE 'sql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER;

что тут неправильно, и как обращаться к вставляемой записи?
Заранее благодарен, Павел.
непраильна тут попытка рекурсивного вызова (вы пытаетесь на вставку 1 строки повесить триггер, вставляющий следующую... до упора).



Если я праильно вас понимаю, вам хотелось бы отапдейтить поле новой записи
посольку ДО вставки ее нет, то
в триггере БЕФОРЕ, достаточно в ф-ии сделать

NEW.INSTR :=
(SELECT "TICKER" FROM "NAME_INSTR" WHERE "NAME" = new."NAME"
--лимит 1 нарно не повредит - значение вжеж, а не набор
)
return NEW;

ели же триггер АФТЕР,то соответсвенно что - то в виде
UPDATE "RIM_TOD" SET "INSTR" = (SELECT .... LIMIT 1 ...)
...
Рейтинг: 0 / 0
создание триггера
    #33150563
puzzle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to XM:
Код: plaintext
1.
    NEW.INSTR := "TICKER" FROM "NAME_INSTR" WHERE "NAME" = new."NAME";
    return NEW;
Выдает такую ошибку.
ERROR: record "new" has no field "instr"
Код: plaintext
insert into "RIM_TOD" ("RECID_EXT","OPERATION","NAME","INSTR","TTS","TDATE","TTIME","VOLLOT","LAST","SIGNBA") ...
to 4321:
Код: plaintext
1.
2.
3.
NEW.INSTR := 
(SELECT "TICKER" FROM "NAME_INSTR" WHERE "NAME" = new."NAME" 
--лимит 1 нарно не повредит - значение вжеж, а не набор
)return NEW; 

ERROR: syntax error at or near "NEW" at character 66

Как определить при UPDATE , что надо именно вставляемую строку изменять?

Заранее благодарен за помощь, Павел.
...
Рейтинг: 0 / 0
создание триггера
    #33150584
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
puzzle wrote:
> to XM:
>
> NEW.INSTR := "TICKER" FROM "NAME_INSTR" WHERE "NAME" = new."NAME";
> return NEW;
>
> Выдает такую ошибку.
> ERROR: record "new" has no field "instr"
>
Код: plaintext
 NEW."INSTR" := "TICKER" FROM "NAME_INSTR" WHERE "NAME" = new."NAME";

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
создание триггера
    #33150785
puzzle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо, получилось.
P.S. А не скажите где можно почитать про Постгре, и в частности про триггеры?
...
Рейтинг: 0 / 0
создание триггера
    #33151608
puzzle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Триггер работает, но хотелось бы еще добавить такое условие
Код: plaintext
1.
2.
3.
4.
5.
  if NEW."INSTR" = 'GSPBEX'
  then
    return NEW;
  end if;
  NEW."INSTR" := "TICKER" FROM "NAME_INSTR" WHERE "NAME" = new."NAME" AND "MARKET"='MSS';
  return NEW;
т.е. чтобы при значении GSPBEX ничего не вставлял.
Выдает ошибку:
ERROR: null value in column "INSTR" violates not-null constraint
...
Рейтинг: 0 / 0
создание триггера
    #33152016
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
puzzle wrote:
> Триггер работает, но хотелось бы еще добавить такое условие
>
> if NEW."INSTR" = 'GSPBEX'
> then
> return NEW;
> end if;
> NEW."INSTR" := "TICKER" FROM "NAME_INSTR" WHERE "NAME" = new."NAME" AND "MARKET"='MSS';
> return NEW;
>
> т.е. чтобы при значении GSPBEX ничего не вставлял.
> Выдает ошибку:
> ERROR: null value in column "INSTR" violates not-null constraint
PostgreSQL 8.0.0 Documentation Chapter 32. Triggers
It can return NULL to skip the operation for the current row. This instructs the executor to not perform the row-level
operation that invoked the trigger (the insertion or modification of a particular table row).

т.е.
Код: plaintext
1.
2.
3.
4.
    if NEW."INSTR" = 'GSPBEX'
    then
      return NULL;
    end if;

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / создание триггера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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