Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите написать триггер / 4 сообщений из 4, страница 1 из 1
10.07.2007, 14:04
    #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
10.07.2007, 14:56
    #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
10.07.2007, 17:42
    #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
11.07.2007, 07:30
    #34652097
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите написать триггер
nedbaИли если сбой будет - то и в таблицу ничего не пропадёт?Если будет сбой, то откатится вся транзакция, и ничего никуда не попадет.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите написать триггер / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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