每個程式設計師都需要了解的一個SQL技巧
對於資料過濾而言CHECK約束已經算是相當不錯了。然而它仍存在一些缺陷,比如說它們是應用到表上面的,但有的時候你可能希望指定一條約束,而它只在特定條件下才生效。
使用SQL標準的WITH CHECK OPTION子句就能完成這點,至少Oracle和SQL Server都實現了這個功能。下面是實現方式:
CREATE TABLE books ( id NUMBER(10) NOT NULL, title VARCHAR2(100 CHAR) NOT NULL, price NUMBER(10, 2) NOT NULL, CONSTRAINT pk_book PRIMARY KEY (id) ); / CREATE VIEW expensive_books AS SELECT id, title, price FROM books WHERE price > 100 WITH CHECK OPTION; / INSERT INTO books VALUES (1, '1984', 35.90); INSERT INTO books VALUES ( 2, 'The Answer to Life, the Universe, and Everything', 999.90 );
正如你看到的那樣,expensive_books 是那些價格大於100塊的書。這個檢視只會返回第二本書:
SELECT * FROM expensive_books;
上述查詢的輸出是:
ID TITLE PRICE -- ----------------------------------------- ------- 2 The Answer to Life, the Universe, and ... 999.9
不過由於我們使用了CHECK OPTION,我們還能防止使用者往”昂貴的書籍”中插入那些廉價的。比如說,我們執行下這個查詢:
INSERT INTO expensive_books VALUES (3, '10 Reasons why jOOQ is Awesome', 9.99);
它是無法生效的。你會看到:
ORA-01402: view WITH CHECK OPTION where-clause violation
我們也無法將貴的書更新成便宜的:
UPDATE expensive_books SET price = 9.99;
這個查詢也會報出同樣的ORA-01402錯誤。
WITH CHECK OPTION內聯
如果你需要區域性防止髒資料被插入到表中,你可以使用WITH CHECK OPTION的內聯子句:
INSERT INTO ( SELECT * FROM expensive_books WHERE price > 1000 WITH CHECK OPTION ) really_expensive_books VALUES (3, 'Modern Enterprise Software', 999.99);
上述查詢同樣也會導到ORA-01402錯誤。
使用SQL轉換來生成特殊約束
CHECK OPTION對於已儲存的檢視非常有用,它使得那些無權直接訪問底層表的使用者能夠獲得正確的授權,而內聯的CHECK OPTION主要是在應用的SQL中間轉換層來進行動態SQL的轉換。
這個可以通過jOOQ的SQL轉換功能來完成,比如說,你可以在SQL語句中對某個表進行約束,從根本上阻止了非法DML的執行。如果你的資料庫沒有本地提供行級別的安全性的話,這也是一個實現多租戶的不錯的方式。
相關文章
- 每個開發人員都需要了解的一個SQL技巧SQL
- 每一個程式設計師需要了解的10個Linux命令程式設計師Linux
- 每個程式設計師都會的 35 個 jQuery 小技巧程式設計師jQuery
- 每個程式設計師都會的35個jQuery小技巧程式設計師jQuery
- 每個程式設計師都需要學習 JavaScript 的7個理由程式設計師JavaScript
- 每個Java程式設計師需要了解的8個Java開發工具Java程式設計師
- 每個程式設計師都會犯的10個錯誤程式設計師
- 每個程式設計師都需要知道一些遊戲網路知識程式設計師遊戲
- 每個程式設計師都應該讀的書程式設計師
- 每個程式設計師都需要知道的概念和術語 - codeburst程式設計師
- 每個程式設計師都必須遵守的程式設計原則程式設計師
- 每個程式設計師都應該知道的下一個程式語言——Kotlin程式設計師Kotlin
- 每個新手程式設計師必看的 SQL 指南程式設計師SQL
- 每個Python新手都應該知道的程式設計技巧Python程式設計
- 每個程式設計師都必讀的10篇文章程式設計師
- 程式設計師需要了解的10個Linux命令程式設計師Linux
- 國外程式設計師推薦:每個程式設計師都應讀的書程式設計師
- 每一個程式設計師都應當瞭解的11句話程式設計師
- Rework:每個程式設計師都應該讀的一本書程式設計師
- 每個程式設計師都應該知道的 15 個最佳 PHP 庫程式設計師PHP
- 每個程式設計師都應該成為架構師程式設計師架構
- 每個程式設計師都應該讀《Unix程式設計藝術》程式設計師
- 每個程式設計師都應該參加一次 GDD程式設計師
- 每個程式設計師都有一個框架夢程式設計師框架
- 每個程式設計師都該閱讀的10本書程式設計師
- 每個程式設計師都該知道的編碼準則程式設計師
- 國外程式設計師推薦:每個程式設計師都應該讀的非程式設計書程式設計師
- 推薦每個程式設計師都看的技術演講程式設計師
- 每個程式設計師都該知道的五大定律程式設計師
- 每個程式設計師都應該知道的基礎數論程式設計師
- 每一個程式設計師都是自學成才程式設計師
- Python 程式設計師需要知道的 30 個技巧Python程式設計師
- JavaScript程式設計師需要掌握的5個debug技巧JavaScript程式設計師
- 每個程式設計師都應該瞭解的一件事程式設計師
- StackOverflow程式設計師推薦:每個程式設計師都應讀的30本書(轉載)程式設計師
- 每個程式設計師都應該經歷一次軟考薦程式設計師
- 每一個程式設計師,都希望能成為分散式系統架構師程式設計師分散式架構
- 每個程式設計師都該知道的10大編碼原則程式設計師