Если пользователи обновляют БД напрямую, они действительно, действительно также должны использовать эту последовательность.То есть,
INSERT (id, a, b, ...) VALUES (seq.nextval, 'bla', 'blo', ) INTO SOMETABLE
Если они этого не делают, вы действительно ничего не можете сделать, чтобы избежать столкновений.
Вы могли бы проверить наличие "занятых" идентификаторов, прочитав все идентификаторы (SELECT MAX(ID) FROM SOMETABLE
), а затем изменить последовательность, чтобы начать выше этого, но, конечно, это работает, пока некоторые пользователи не входят в другойзапись.
Перед каждой операцией можно проверять «свободный идентификатор», но это, вероятно, будет слишком медленным.
Я вижу только два реальных решения:
- Убедитесь, что все вставки используют последовательность для генерации идентификаторов.Возможно, напишите хранимую процедуру для использования пользователями или какую-нибудь вспомогательную программу ...
- Используйте UUID в качестве идентификатора вместо целого числа.Это, конечно, требует изменения схемы.
И кстати: зачем вашим пользователям прямой доступ к БД?Это кажется мне очень необычным (и опасным по многим причинам, одна из которых вы описываете).Подумайте, как-то контролировать / опосредовать доступ, предоставляя некоторый интерфейс или, по крайней мере, некоторые хранимые процедуры.В противном случае обучение пользователей кажется вашим единственным вариантом ...