假设你有如下表(注:这是一个人为/简体为例):在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参数被忽略。
是否有一种编程方式来强制每个select,insert,update等查询在where子句中指定book_id?
我们为查询动态生成SQL代码并使用Spring的JdbcTemplate执行它们。数据库是Oracle。使用自动化测试来检查许多可能的查询(加上将来添加的新查询!)不会被重复的page_id绊倒是非常棘手的。我可以覆盖JdbcTemplate代码,以确保sql查询始终包含book_id参数,但涉及到手动解析SQL代码(尤其是使用子查询来处理棘手问题)并且看起来很诡异。是否有更强大的解决方案来执行此操作?一些触发器,存储过程,约束?
什么数据库?您可能可以通过PostgreSQL规则系统实现这些目标。 – 2010-10-21 21:22:01
感谢您的建议。刚刚补充说“Oracle”是原始问题的DB。 – 2010-10-21 21:23:34
如果有人想运行不需要book_id的查询,例如“找到页数最多的书” - 这样的查询在book_id上不会有谓词。 – 2010-10-22 02:24:26