powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Тригерная функция
14 сообщений из 14, страница 1 из 1
Тригерная функция
    #38546498
andrey_velsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Попробую поточнее описать проблему.
Имеется таблица, содержащая некие записи. Структура, допустим, такова:

id | id_workplace | conf | scandate

Необходимо, чтобы при вставке новых значений срабатывала функция, сверяющая поле conf у новой записи с более ранней записью, имеющей точно такой же id_workplace . В случае, если поля идентичны - ничего не происходит, в противном - вставка записи.
Заранее спасибо!
...
Рейтинг: 0 / 0
Тригерная функция
    #38546608
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Тригерная функция
    #38547033
andrey_velsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил задачу таким способом:

авторCREATE OR REPLACE FUNCTION add_to_test () RETURNS TRIGGER AS $$
DECLARE
Fconf text;
BEGIN
SELECT conf INTO Fconf FROM test WHERE id = NEW.id ORDER BY scandate DESC LIMIT 1;
IF Fconf = NEW.conf THEN
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER t_test
BEFORE INSERT ON test FOR EACH ROW EXECUTE PROCEDURE add_to_test ();

Теперь задача усложняется: необходимо сверять все поля в таблице, за исключением некоторых. Причем таких таблиц - несколько штук. Название столбцов, по которым НЕ надо производить сравнение во всех таблицах одинаковы.
Возможно ли данную операцию описать в рамках одной функции, или для каждой таблицы необходимо создавать свою функцию/триггер, учитывая каждое поле?
...
Рейтинг: 0 / 0
Тригерная функция
    #38548504
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто перевести фразу
andrey_velskнеобходимо сверять все поля в таблице, за исключением некоторых

с языка хотелок на язык, который можно вставить сюда:
andrey_velsk SELECT conf INTO Fconf FROM test WHERE id = NEW.id ORDER BY scandate DESC LIMIT 1;

то есть, как я смутно догадываюсь, язык логики. Не пробовали?
...
Рейтинг: 0 / 0
Тригерная функция
    #38548509
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
секцию where не подсветило в цитате. Косячок, однако.
...
Рейтинг: 0 / 0
Тригерная функция
    #38548967
andrey_velsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hawkmoon, уважаемый.

То, что Вы мне подсветили - это условие отбора строк. Я же в своем сообщении имел в виду, что мне необходимо выбрать некое количество полей, за исключением некоторых, более безболезненным способом Т.е. Вместо того, чтобы писать SELECT t1, t2, ..., tn , сконструировать запрос неким образом, вроде SELECT * except t2, t4. Надеюсь, доходчиво объяснил. Т.о. , Вы подсветили мне не ту секцию в запросе.

Нашел следующее решение данной проблемы, но не задачи в целом:
авторSELECT 'SELECT ' ||
ARRAY_TO_STRING(ARRAY(SELECT COLUMN_NAME::VARCHAR(50)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='table' AND
COLUMN_NAME NOT IN ('col1','col2')
ORDER BY ORDINAL_POSITION
), ', ') || ' FROM table'


Теперь необходимо лишь как то сравнить результат этого запроса с колонками вставляемой записи NEW
...
Рейтинг: 0 / 0
Тригерная функция
    #38549263
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любопытно, уважаемый. И как же вы будете результат
andrey_velskSELECT * except t2, t4.
хранить в переменных для последующего анализа?

Допустим, сколько вам нуна переменных? Какого типа?
Как построить повторный запрос?

Пока на эти вопросы ответа нет - задача по-прежнему не перешла из разряда "хотелки" в разряд "принципиально автоматизируемого". От которого, спустя документ "ТЗ", можно требовать реализацию.

ну или решать кусками, да.
...
Рейтинг: 0 / 0
Тригерная функция
    #38549641
andrey_velsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hawkmoon,
Отвечаю на ваши вопросы в соответствии результатам моих поисков:
1)Для хранения результатов запроса я считаю возможным использовать переменную типа record . В последующем, обращаться к нужному полю как ПЕРЕМЕННАЯRECORD.названиеполя .
2)Для повторного запроса необходимо лишь изменить название таблицы, которое можно взять из переменной TG_RELNAME .
Прошу поправить меня, если какой то из этих вариантов нереализуем.
...
Рейтинг: 0 / 0
Тригерная функция
    #38550222
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_velsk,

тут недавно обсуждали, как непросто, в общем-то, в хранимке обратиться к "ПЕРЕМЕННАЯRECORD.названиеполя"
Другой вопрос, что если у вас таблица, к примеру, materials,
вы объявляете переменную типа materials, сиречь один тупл из релейшена, и по нему уже вышеуказанной конструкцией прыгаете.

А для совсем произвольных - огребете. По крайней мере такое впечатление от той дискуссии осталось.
...
Рейтинг: 0 / 0
Тригерная функция
    #38550405
Гость_0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hawkmoonandrey_velsk,

тут недавно обсуждали, как непросто, в общем-то, в хранимке обратиться к "ПЕРЕМЕННАЯRECORD.названиеполя"
зависит от языка, например на plperl - очень просто :)
...
Рейтинг: 0 / 0
Тригерная функция
    #38550591
andrey_velsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил (пока) все же написать по одной фукции для таблицы, т.е. идти перечислением полей и их последующей сверкой с полями вставляемой записи. Столкнулся с новой трудностью: если в результате запроса возвращается несколько строк, как проработать каждую из них? Для записи результата в переменную record использую конструкцию EXECUTE (...) INTO.

Гость_0, был бы премного благодарен за более подробное описание, если возможно - с примерами.
...
Рейтинг: 0 / 0
Тригерная функция
    #38551079
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_velsk,

а почему вы хотите перебирать варианты во функции? не проще спросить у БД существует ли дубликат?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
.....
IF EXISTS (
  SELECT 1 
  FROM table AS t
  WHERE
    (t.field1, t.field2, t.field3, ...) = (NEW.field1, NEW.field2, NEW.field3, ...);
  )
THEN
  RETURN NULL;
END IF;
RETURN NEW;
......
...
Рейтинг: 0 / 0
Тригерная функция
    #38551083
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_velsk,

да, прикрутил и ситах еррор. ";" есть лишняя.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
.....
IF EXISTS (
  SELECT 1 
  FROM table AS t
  WHERE
    (t.field1, t.field2, t.field3, ...) = (NEW.field1, NEW.field2, NEW.field3, ...)
  )
THEN
  RETURN NULL;
END IF;
RETURN NEW;
......
...
Рейтинг: 0 / 0
Тригерная функция
    #38551156
andrey_velsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,
Наткнулся на этот метод, именно его сейчас и реализовываю.
Спасибо большое Вам за ответ!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Тригерная функция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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