假設你有如下表(注:這是一個人爲/簡體爲例):在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