Представьте, что у вас есть следующая таблица (примечание: это надуманный / упрощенный пример):
CREATE TABLE foo (
book_id number,
page number,
-- [a bunch of other columns describing a single page in a book]
);
ALTER TABLE foo
ADD (CONSTRAINT foo_pk PRIMARY KEY(book_id, page));
Хотя пары (book_id, page) уникальны, один и тот же номер страницы будет повторяться между книгами (у многих книг будет страница 1).Поэтому, если SQL-запрос не указывает book_id, неправильные страницы могут быть выбраны / обновлены / удалены.Все наши запросы должны обрабатывать только одну книгу за раз, но я видел пару ошибок, в которых параметр book_id был случайно пропущен.
Существует ли программный способ обеспечить, чтобы каждый запрос на выбор, вставку, обновление и т. Д. Указывал book_id в предложении where?
Мы генерируем код SQL длядинамически запрашивает и выполняет их, используя Spring JdbcTemplate.База данных Oracle.Использовать автоматические тесты для проверки того, что множество возможных запросов (плюс новые, которые будут добавлены в будущем!) Не будут отключены дублирующимися page_ids, сложно.Я мог бы переопределить код JdbcTemplate, чтобы гарантировать, что запросы sql всегда включают параметр book_id, но это включает ручной анализ кода SQL (особенно сложно с подзапросами) и кажется хакерским.Есть ли более надежное решение для обеспечения этого?Какой-то триггер, хранимая процедура, ограничение?