#postgresql
Вопрос:
Я изучаю, как работает Postgres, и решил, что любые данные о дате/времени в моей базе данных должны иметь тип данных timestamptz.
Правила, определяющие, как Postgres анализирует информацию о дате/времени, различаются в зависимости от часового пояса сервера, часового пояса сеанса клиента и/или настройки часового пояса базы данных. Я не могу ожидать, что мои разработчики будут знать все это, поэтому, чтобы избежать какой-либо двусмысленности, я хотел бы каким-то процедурным образом потребовать, чтобы часовой пояс указывался в любой ВСТАВКЕ или ОБНОВЛЕНИИ столбца timestamptz, и чтобы любые ОБНОВЛЕНИЯ или ВСТАВКИ не выполнялись, когда входное значение для столбца timestamptz явно не включает часовой пояс. Я создал регулярное выражение, которое я могу использовать для сопоставления с входным значением; Я просто не знаю, как подключить водопровод.
Сначала я подумал, что могу сделать это с пользовательским доменом; однако, похоже, что ограничение ПРОВЕРКИ домена выполняется после того, как входная строка уже проанализирована, так что это не сработает. (К тому времени сервер уже определил часовой пояс для значений, в которых часовой пояс явно не был включен.)
Я мог бы использовать пользовательский тип данных, но там целая банка червей, и я не уверен, что это сохранит все операторы и функции, которые будут работать с базовым столбцом timstamptz.
Я мог бы использовать триггеры BEFORE INSERT и BEFORE UPDATE, но для этого мне потребуется выполнить итерацию по каждому столбцу в НОВОЙ записи, определить ее тип данных, а затем сверить значение с регулярным выражением, чтобы убедиться, что указан часовой пояс.
Есть ли у сообщества какие-либо идеи о том, как этого добиться? Я думаю, что ПЕРЕД ВСТАВКОЙ/ПЕРЕД ОБНОВЛЕНИЕМ, вероятно, лучшее место для выполнения этой работы, но я не знаю, как перебирать новую запись и находить тип данных для каждого столбца.
Есть ли более простой способ сделать это, который я пропустил?
Ответ №1:
Я не могу ожидать, что мои разработчики будут знать все это
Я думаю, что это твоя проблема. Если вы хотите использовать PostgreSQL и работать с часовыми поясами, вам нужно, чтобы ваши разработчики это понимали.
Все очень просто: только timezone
правильно установите параметр для клиентской сессии, тогда все будет просто работать.