Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проверка данных средствами Postgres  (Прочитано 11203 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« : 29-03-2006 12:48 » 

Задача такая:

В рамках транзакции Postgres создаются и модифицируются записи в таблице. Необходимо проверять данные до завершения транзакции или во время завершения. Если проверка не пройдет - отбрасывать транзакцию.

В псевдокоде выглядит примерно так:

begin transaction
    insert into T...
    select T.id...
    update T... where T.id=id
    update T... where T.id=id
    update T... where T.id=id
    ...
commit (<-- вот здесь надо проверить, что запись с ключом id содержит корректные данные)

Существует такой механизм, как триггер, но его можно повесить только на insert, update и  delete. То есть, на commit триггер повесить нельзя.

Вопрос: как решить подобную задачу? Кто уже сталкивался?
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #1 : 29-03-2006 13:18 » 

а почему нельзя так:
Код:
begin transaction
    insert into T...
    select T.id...
    update T... where T.id=id
    update T... where T.id=id
    update T... where T.id=id
    ...
    select T ... where T.id=id
    --  Проверка
commit
Записан

Удачного всем кодинга! -=x[PooH]x=-
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 29-03-2006 13:23 » 

Что ты имеешь в виду? На select нельзя повесить триггер, насколько мне известно.
Если ты предлагаешь выполнять проверку на клиенте, то я этого сделать не могу по сложившимся обстоятельствам.

Была мысль сделать так
begin transaction
    insert into T...
    select T.id...
    update T... where T.id=id
    update T... where T.id=id
    update T... where T.id=id
    ...
    select T.* where T.id=id
    update T.* where T.id = id

commit

Затем повесить трриггер на update и ждать, когда update будет обновлять все поля в записи (то есть последний).
Но это не совсем то, что нужно. Хотя и позволяет решить проблему.
« Последнее редактирование: 29-03-2006 13:27 от Hooter » Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #3 : 29-03-2006 13:38 » 

Цитата
Если ты предлагаешь выполнять проверку на клиенте
ну ты же не написал, что это на клиенте, я по привычке подумал, что это хранимая процедура...
А вызвать хранимую процедуру проверки " по сложившимся обстоятельствам" можно? или процедуры вообще не рассматриваются?

я так понимаю объединить update в один то же не получится.

можно перед комитом делать запись в другую таблицу (например, в журнал) и вешать тригер на нее...

в общем, для решения проблему надо больше знать о сложившившихся обстоятельствах.
говори, чего "можно", а чего "нельзя".

под "псевдокодом" понимаются действия на клиенте?
Записан

Удачного всем кодинга! -=x[PooH]x=-
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #4 : 29-03-2006 13:40 » 

Цитата
Что ты имеешь в виду? На select нельзя повесить триггер, насколько мне известно.
я имел ввиду, выбрать необходимые для проверки данные...
но этот вариант уже не рассматривается.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 29-03-2006 13:52 » 

Под псевдокодом подразумеваются действия на клиенте.
Есть установка: проверять корректность данных в момент завершения транзакции средствами БД.

Переформулирую вопрос: может быть как-то можно отследить момент завершения транзакции и управлять ходом транзакции?
Можно ли на клиенте вместо commit вызвать хранимую процедуру и в ней проверять данные?
« Последнее редактирование: 29-03-2006 13:55 от Hooter » Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #6 : 29-03-2006 14:02 » 

Цитата
Можно ли на клиенте вместо commit вызвать хранимую процедуру и в ней проверять данные?
ну в Oracle можно, в Postgress скорее всего тоже.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 30-03-2006 04:38 » new

PooH, спасибо, попробую.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines