2012-09-21 2 views
2

Этот вопрос является продолжением этого question, но это совершенно другое из того, что, по моему мнению, оно заслуживает собственной дискуссии. Для немного фона, вы можете обратиться к нему.Переменные транзакции PostgreSQL

В качестве части системы импорта нового файла я создаю систему аудита на основе этой вики page. Но одна из вещей, которые я хотел бы включить в контрольный журнал, - это имя файла, из которого были получены данные (эти файлы заархивированы для долгосрочного хранения, поэтому, если есть вопросы, я всегда могу вернуться).

Один из способов, которым я мог бы пойти, это создать запись import_batch и записать там имя файла, а затем просто штамповать записи при их обновлении. Каков путь, по которому я иду. Но он чувствует себя немного неуклюжим. Я размышлял над тем, как заставить триггер аудита получать import_batch_id без необходимости быть в записи NEW. *. Мне кажется, что есть, по крайней мере, несколько способов, которыми я мог бы это сделать.

  1. Я мог бы иметь функцию, которая может создать временную таблицу и хранить любую информацию в нем, что я хочу (например, партии # или имя файла или любой другой). Это кажется довольно чистым, и я понимаю, что он будет жить только в течение транзакции. И, как я понимаю, не нужно беспокоиться об именовании столкновений. Каждая транзакция будет иметь временный файл с именем «tmp_import_info».

  2. Если мне только заботится о import_batch_id (который имеет seq), я мог бы просто получить текущее значение секвенсора. Я не уверен на 100%, как это будет вести себя в многопользовательской настройке. Я бы подумал, что можно было бы сделать trans # 1 для создания import_batch_id # 222, а затем trans # 2 для запуска и получить # 223. И тогда мой контрольный журнал будет записывать неверные данные.

Есть ли другие варианты, которые я здесь не вижу? Есть ли способ добавить переменную транзакции/сессии? В принципе, что-то вроде pg_settings (но это позволяет вставлять, обновлять и удалять значения).

Похоже, что лучшим вариантом может быть таблица темпа.

ответ

1

Главная хорошая новость для варианта 2. является - цитировал the manual here:

currval

Возвращает значение совсем недавно получено nextval для этой последовательности в текущей сессии. (Сообщается об ошибке, если в этой сессии никогда не вызывали nextval). Поскольку это возвращает локальное значение сеанса, оно дает предсказуемый ответ, выполнялись ли или нет другие сеансы nextval с текущего сеанса.

Храните ваши имена файлов импорта в таблицу с serial первичный ключ. Вы можете обратиться к за последним значением из последовательности с currval или lastval. Параллельные пользователи не могут вмешиваться. До тех пор, пока вы не сорвите этот путь внутри своей собственной транзакции самостоятельно, это безопасно.

+0

Ok. Имеет смысл. Поскольку он включен в триггер аудита, возможно, что он может быть отредактирован вне контекста регулярного импорта (также через скрипт из pgAdminIII).В этом случае я, вероятно, мог бы просто ловушку для SQLSTATE '55000'. Я испытываю небольшой риск того, что кто-то в сеансе pgAdminIII запускает скрипт, который влияет на таблицу import_batch ... но, похоже, что я рискую/слабостью, с которой я могу жить. –

Смежные вопросы