powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите написать триггер
4 сообщений из 4, страница 1 из 1
помогите написать триггер
    #34650318
nedba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггеры для постреса раньше не писал.
Прочитал документацию и написал следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE FUNCTION basecolors_insert(tcolors colors) RETURNS bool AS
$BODY$
BEGIN
  DECLARE tcolor colors%rowtype;
  FOR tcolor IN select c.id, c.name from colors c where c.name =~ new.name
    LOOP
      insert colorlinks (colorkey_id, color_id, basecolors_id)
      values (new.colorkey_id, tcolor.id, new.id)
    END LOOP;
  RETURN NEW;
END
$BODY$
LANGUAGE 'sql' VOLATILE;
ALTER FUNCTION basecolors_insert(colors) OWNER TO customer;

Но банально сообщает "syntax error"

из доступных языков предлагает только "C" и "internal".
"C" не подходит по тому что нет доступа к серверу и каталогу $libdir/
А для "internal" - ERROR: there is no built-in function named

Помогите понять в чем не прав и как нужно делать правельно.
...
Рейтинг: 0 / 0
помогите написать триггер
    #34650547
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) блок
Код: plaintext
1.
2.
3.
4.
declare
-- объявляем переменные
begin
-- манипулируем переменными
end
2) не забываем про ; , должна быть после запроса в цикле
3) в данном случае, как я понял, LANGUAGE 'plpgsql'
4) языки устанавливаются в БД, см.
Код: plaintext
CREATE LANGUAGE plpgsql;
5) триггерная функция объявляется не так как обычная, и у нее другое возвращаемое значение

пример
Код: plaintext
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.
CREATE OR REPLACE FUNCTION tf_enterprise_2()
  RETURNS "trigger" AS
$BODY$
declare
    parent       enterprise%ROWTYPE;
begin
    select * into parent
    from enterprise e
    where e.id_enterprise=new.id_enterprise_parent;
    if not found then
       new.step       :=  0 ;
       new.hierarchie := new.id_enterprise;
    else
       new.step       := parent.step +  1 ;
       new.hierarchie := parent.hierarchie || '.' || new.id_enterprise;
    end if;

    return new;
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION tf_enterprise_2() OWNER TO postgres;

CREATE TRIGGER t_enterprise_i_2
  BEFORE INSERT
  ON enterprise
  FOR EACH ROW
  EXECUTE PROCEDURE tf_enterprise_2();
...
Рейтинг: 0 / 0
помогите написать триггер
    #34651234
nedba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
CREATE LANGUAGE plpgsql;

Это действительно то что нужно было!

БоЛьШоЕ спасибо!

В итоге получилось вот что (на всякий случай привожу src, может кому и сгодится для вхождения )

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE OR REPLACE FUNCTION basecolors_insert()
  RETURNS "trigger" AS
$BODY$
DECLARE
  tcolor colors%ROWTYPE;
BEGIN
  FOR tcolor IN select c.id from colors c where c.name ~* new.name
    LOOP
      insert into colorlinks (colorkey_id, color_id, basecolors_id)
      values (new.colorkey, tcolor.id, new.id);
    END LOOP;
  return new;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION basecolors_insert() OWNER TO customer ;

Только для того чтобы констрейнты не нарушались, пришлось AFTER использовать. По тому вопрос - возможно ли что из-за сбоя триггера. Запись добавится в таблицу - а то что должно добавится в colorlinks не добавится? Или если сбой будет - то и в таблицу ничего не пропадёт?
...
Рейтинг: 0 / 0
помогите написать триггер
    #34652097
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nedbaИли если сбой будет - то и в таблицу ничего не пропадёт?Если будет сбой, то откатится вся транзакция, и ничего никуда не попадет.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите написать триггер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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