|
|
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Попробую поточнее описать проблему. Имеется таблица, содержащая некие записи. Структура, допустим, такова: id | id_workplace | conf | scandate Необходимо, чтобы при вставке новых значений срабатывала функция, сверяющая поле conf у новой записи с более ранней записью, имеющей точно такой же id_workplace . В случае, если поля идентичны - ничего не происходит, в противном - вставка записи. Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2014, 19:34:53 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
andrey_velsk, http://www.google.com/search?hl=ru&source=hp&q=postgresql before insert trigger&gbv=2&oq=postgresql before in&gs_l=heirloom-hp.3.0.0l2j0i22i30l8.364.6290.0.8699.20.15.0.5.5.1.1226.4673.2j4j2j5j0j1j0j1.15.0....0...1ac.1.34.heirloom-hp..7.13.1724.tCjtsCG_Cl4 bart_simpson_google.jpg ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2014, 22:10:44 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
Решил задачу таким способом: автор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 (); Теперь задача усложняется: необходимо сверять все поля в таблице, за исключением некоторых. Причем таких таблиц - несколько штук. Название столбцов, по которым НЕ надо производить сравнение во всех таблицах одинаковы. Возможно ли данную операцию описать в рамках одной функции, или для каждой таблицы необходимо создавать свою функцию/триггер, учитывая каждое поле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2014, 12:37:24 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
Просто перевести фразу andrey_velskнеобходимо сверять все поля в таблице, за исключением некоторых с языка хотелок на язык, который можно вставить сюда: andrey_velsk SELECT conf INTO Fconf FROM test WHERE id = NEW.id ORDER BY scandate DESC LIMIT 1; то есть, как я смутно догадываюсь, язык логики. Не пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2014, 13:30:18 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
секцию where не подсветило в цитате. Косячок, однако. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2014, 13:32:07 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2014, 16:39:06 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
Любопытно, уважаемый. И как же вы будете результат andrey_velskSELECT * except t2, t4. хранить в переменных для последующего анализа? Допустим, сколько вам нуна переменных? Какого типа? Как построить повторный запрос? Пока на эти вопросы ответа нет - задача по-прежнему не перешла из разряда "хотелки" в разряд "принципиально автоматизируемого". От которого, спустя документ "ТЗ", можно требовать реализацию. ну или решать кусками, да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2014, 19:03:51 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
Hawkmoon, Отвечаю на ваши вопросы в соответствии результатам моих поисков: 1)Для хранения результатов запроса я считаю возможным использовать переменную типа record . В последующем, обращаться к нужному полю как ПЕРЕМЕННАЯRECORD.названиеполя . 2)Для повторного запроса необходимо лишь изменить название таблицы, которое можно взять из переменной TG_RELNAME . Прошу поправить меня, если какой то из этих вариантов нереализуем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2014, 08:06:36 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
andrey_velsk, тут недавно обсуждали, как непросто, в общем-то, в хранимке обратиться к "ПЕРЕМЕННАЯRECORD.названиеполя" Другой вопрос, что если у вас таблица, к примеру, materials, вы объявляете переменную типа materials, сиречь один тупл из релейшена, и по нему уже вышеуказанной конструкцией прыгаете. А для совсем произвольных - огребете. По крайней мере такое впечатление от той дискуссии осталось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2014, 13:57:25 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
Hawkmoonandrey_velsk, тут недавно обсуждали, как непросто, в общем-то, в хранимке обратиться к "ПЕРЕМЕННАЯRECORD.названиеполя" зависит от языка, например на plperl - очень просто :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2014, 15:08:45 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
Решил (пока) все же написать по одной фукции для таблицы, т.е. идти перечислением полей и их последующей сверкой с полями вставляемой записи. Столкнулся с новой трудностью: если в результате запроса возвращается несколько строк, как проработать каждую из них? Для записи результата в переменную record использую конструкцию EXECUTE (...) INTO. Гость_0, был бы премного благодарен за более подробное описание, если возможно - с примерами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2014, 16:22:17 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
andrey_velsk, а почему вы хотите перебирать варианты во функции? не проще спросить у БД существует ли дубликат? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2014, 20:50:06 |
|
||
|
Тригерная функция
|
|||
|---|---|---|---|
|
#18+
andrey_velsk, да, прикрутил и ситах еррор. ";" есть лишняя. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2014, 20:51:58 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38549263&tid=1998861]: |
0ms |
get settings: |
4ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
150ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 184ms |
| total: | 396ms |

| 0 / 0 |
