Представьте, что вы имеете следующую таблицу (примечание: это надуманный/упрощенный пример):Необходимые параметры в предложении SQL where?
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, страница) пары являются уникальными, и та же страница будет повторяться между книгами (много книг будет есть страница 1). Поэтому, если SQL-запрос не указывает book_id, могут быть выбраны/обновлены/удалены неправильные страницы (-ы). Все наши запросы должны действовать только по одной книге за раз, но я видел пару ошибок, где параметр book_id был случайно опущен.
Существует ли программный способ обеспечения того, чтобы каждый запрос на выбор, вставку, обновление и т.д. указывал book_id в предложении where?
Мы генерируем SQL-код для запросов динамически и выполняем их с использованием Spring JdbcTemplate. База данных - это Oracle. Используя автоматические тесты, чтобы проверить, что многие возможные запросы (плюс новые, которые добавляются в будущем!), Не сработают с дублированием page_ids. Я мог бы переопределить код JdbcTemplate, чтобы гарантировать, что sql-запросы всегда включают параметр book_id, но это требует ручного разбора кода SQL (особенно сложного с подзапросами) и кажется взломанным. Есть ли более надежное решение для обеспечения этого? Некоторые триггер, хранимая процедура, ограничение?
Какую базу данных? Вы могли бы достичь некоторых из этих целей с помощью системы правил PostgreSQL. –
Спасибо за предложение. Просто добавил, что «Oracle» - это БД к исходному вопросу. –
Что делать, если кто-то хочет запустить запрос, который не нуждается в book_id, например. «найти книгу с наибольшим количеством страниц» - такой запрос не будет иметь предиката на book_id. –