【发布时间】:2010-10-21 21:19:38
【问题描述】:
假设您有下表(注意:这是一个人为/简化的示例):
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 参数被意外省略了。
是否有一种编程方式来强制每个选择、插入、更新等查询在 where 子句中指定一个 book_id?
我们为查询动态生成 SQL 代码并使用 Spring 的 JdbcTemplate 执行它们。数据库是甲骨文。使用自动化测试来检查许多可能的查询(以及将来添加的新查询!)不会被重复的 page_ids 绊倒是很棘手的。我可以覆盖 JdbcTemplate 代码以确保 sql 查询始终包含 book_id 参数,但这涉及手动解析 SQL 代码(尤其是子查询时很棘手)并且看起来很麻烦。是否有更强大的解决方案来执行此操作?一些触发器、存储过程、约束?
【问题讨论】:
-
什么数据库?使用 PostgreSQL 规则系统,您或许可以实现其中的一些目标。
-
感谢您的建议。刚刚补充说“Oracle”是原始问题的数据库。
-
如果有人想要运行不需要 book_id 的查询,例如“找到页数最多的书”——这样的查询不会有关于 book_id 的谓词。
-
真实世界的案例并没有真正处理书籍和页面,我只是修改了表/列名称以便在这里讨论。在实际领域中,生产代码永远跨多个“书”运行查询是没有意义的。它可能在未来某个时候对分析有用,但无论如何这将在数据仓库(即单独的数据库)之外完成。