Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггер с параметрами / 12 сообщений из 12, страница 1 из 1
06.03.2005, 20:20
    #32949291
Little John
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с параметрами
Не создается какого-то черта. Ткните носом, пожалуйста.
Код: plaintext
1.
2.
3.
create or replace function foo (character) returns trigger as '
return "OK"
'language plpythonu
А команда
Код: plaintext
1.
create trigger bar after insert on bla_bla_bla for each row execute procedure foo ('e_moe')
выдает ошибку "Функция foo() не существует".
...
Рейтинг: 0 / 0
06.03.2005, 22:39
    #32949316
Vlado
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с параметрами
Из документации:
The trigger function must be defined before the trigger itself can be created. The trigger function must be declared as a function taking no arguments and returning type trigger. (The trigger function receives its input through a specially-passed TriggerData structure, not in the form of ordinary function arguments.)
...
Рейтинг: 0 / 0
07.03.2005, 01:30
    #32949362
CM Hungry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с параметрами
Little JohnНе создается какого-то черта. Ткните носом, пожалуйста.
Код: plaintext
1.
2.
3.
create or replace function foo (character) returns trigger as '
return "OK"
'language plpythonu
А команда
Код: plaintext
1.
create trigger bar after insert on bla_bla_bla for each row execute procedure foo ('e_moe')
выдает ошибку "Функция foo() не существует".
Может, не character а varchar надо тип параметра задать?
...
Рейтинг: 0 / 0
07.03.2005, 08:29
    #32949396
Vlado
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с параметрами
CM HungryМожет, не character а varchar надо тип параметра задать?
Ага. А еще лучше TEXT.
Вы хотя бы предыдущие посты читаете?
Краткий перевод: триггеная функция не может иметь параметров.
Про документацию молчу - кто ж ее читает :)
...
Рейтинг: 0 / 0
07.03.2005, 12:19
    #32949498
Little John
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с параметрами
Хм.... Тогда нужно дать по башке составителям документации. На хрена они публикуют подобные фрагменты?

40.2. Trigger Functions
When a function is used in a trigger, the dictionary TD contains trigger-related values. The trigger rows are in TD["new"] and/or TD["old"] depending on the trigger event. TD["event"] contains the event as a string (INSERT, UPDATE, DELETE, or UNKNOWN). TD["when"] contains one of BEFORE, AFTER, and UNKNOWN. TD["level"] contains one of ROW, STATEMENT, and UNKNOWN. TD["name"] contains the trigger name, and TD["relid"] contains the OID of the table on which the trigger occurred. If the trigger was called with arguments they are available in TD["args"][0] to TD["args"][(n-1)].
If TD["when"] is BEFORE, you may return None or "OK" from the Python function to indicate the row is unmodified, "SKIP" to abort the event, or "MODIFY" to indicate you've modified the row.

Мало того, гугль выдал кучу примеров триггеров с параметрами. Ну ладно, буду копать дальше...
...
Рейтинг: 0 / 0
07.03.2005, 12:26
    #32949507
Little John
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с параметрами
Да, кстати, знатоку документации:

http://www.postgresql.org/docs/7.4/static/sql-createtrigger.html

Вы ничего про параметры не заметили? Читайте внимательнее.
...
Рейтинг: 0 / 0
07.03.2005, 22:29
    #32949838
Триггер с параметрами
Little JohnДа, кстати, знатоку документации:

http://www.postgresql.org/docs/7.4/static/sql-createtrigger.html

Вы ничего про параметры не заметили? Читайте внимательнее.

если дон подскажет, как создать (и вызвать) в триггере ф-ю с аргументами, буду признателен. (мои попытки в plpgsql не увенчались). Возможно можно вызвать из Constraint Trigger-а (кажется тоже не получалось, но лень перепроверять). Но констрайнт триггеры - это "что-то особеннова". Без излишней надобности вряд ли стоит их создавать (руками).
...
Рейтинг: 0 / 0
08.03.2005, 13:32
    #32950017
Vlado
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с параметрами
Посыпаю голову пеплом...
У меня PostgreSQL 8.0.1.
Действительно, в документации фигурируют параметры триггерной функции.
Тем не менее у меня ошибка такая же, как и в 1-м посте,
и если первый пост подправить так
Код: plaintext
1.
create or replace function foo() returns trigger as '
...
то ошибка не возникает.
Значица, в одном месте документации (и в реализации) отказались
от параметров, а в другом месте это дело осталось как благие намерения
или атавизм от одной из предыдущих версий.
По большому счету они правы (не в документации!),
так как эти параметры и нафик не нужны, потому как
в CREATE TRIGGER их можно объявить только как константы.
Кто мешает использовать константы в теле функции?
А реализация как-никак упрощается.
...
Рейтинг: 0 / 0
09.03.2005, 21:08
    #32952287
centur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с параметрами
мдя.. документацию надо читать а не листать... и с примерами там все ОК, в том числе и для 7.4

Во первых - TD[xxx] создаются НЕ для языка plpgsql (из постов я понял вы используете этот язык), а для plperl и\или pltcl (не помню точно, проверять детально - сами посмотрите в документации эти страницы и присмотритесь к разделу и исходнику функции)
во-вторых есть отдельное описалово, как использовать триггерные функции с параметрами.. а именно
create function f() returns trigger bla bla bla
'
define
param1 text
begin
bla bla bla
param1=TG_ARGV[x];

bla bla bla

end;
'

где х - порядковый номер аргумента, начинающийся с 0
соответственно

create trigger zzzzzz
bla bla bla
EXECUTE PROCEDURE f('15');

и в param1 у нас попадет 15

если непонятно - вам сюда.
http://www.postgresql.org/docs/8.0/static/plpgsql-trigger.html

между прочим по 7.4 почти та же дока, в 8.0 только приимеров больше
...
Рейтинг: 0 / 0
10.03.2005, 10:29
    #32952665
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с параметрами
centurмдя.. документацию надо читать а не листать... и с примерами там все ОК, в том числе и для 7.4

мдя-с. если дон сразу нашли описалово, так и что ж, женилка у них больше, что ли? Не факт.

Об том и вопрос был, что "стандартная" передача параметров в триггерную ф-ю не работает (в plpg). А то что она работает через то место, через которое проктолог гланды удаляет - не всякий и не враз догадается. А без подсказки опытного, или начитанного дона не враз и сыщешь в доке.

т.ч. спасибо дону за наводку. И за безпримерную терпимость, с каковою он наставляет нас, лохов, на путь истины.

(ybxtuj kbxyjuj?)
...
Рейтинг: 0 / 0
10.03.2005, 16:05
    #32953849
Vlado
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с параметрами
В итоге я понял так.
Триггерная функция на любом языке объявляется без параметров.
В операторе CREATE TRIGGER эта функция вызывается
с любым количеством параметров-строковых констант.
В теле функции доступ к этим параметрам имеем
в pl/pgsql - через TG_ARGV[],
в pl/tcl - через $args,
в pl/perl - через @{$_TD->{args}},
в pl/python - через TD["args"][],
в С - через fcinfo->context->tg_trigger->tgargs
...
Рейтинг: 0 / 0
10.03.2005, 20:36
    #32954436
centur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с параметрами
2Асса, ничего личного, но вот я например научился всему что знаю в plpgsql исключительно по хелпу... я заглядывал во всякие умные книжки со слонами, но понятней, доступней и интуитивней материала, чем в оффициальной документации я не нашел. Может плохо искал конечно, но на любой вопрос поиск по доке выдает материалы, бегло просмотрев которые - знаешь куда копать. Может, конечно, английский страдает - тогда трудно, это да... А не самый ласковый тон - по одной причине - во втором посте Vlado дал сразу совершенно четкую наводку - где копать...


автор
The trigger function must be defined before the trigger itself can be created. The trigger function must be declared as a function taking no arguments and returning type trigger. ( The trigger function receives its input through a specially-passed TriggerData structure , not in the form of ordinary function arguments.)

а потом все, дружно НЕ читая предыдущие сообщения, ломанулись рассуждать что не умеет и какие разработчики бяки, вводят в заблуждение..
Это и "удивило"


2vlado - абсолютно правильно..

Tip: А если еще поискать в хелпе по TG_ARGV, то найдете много интересных специальных структур для триггеров, что крайне облегчает задачи как работы с параметрами так и некоторые другие...
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггер с параметрами / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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