PostgreSQL 是一個功能強大的開源關聯式資料庫管理系統,提供各種功能來增強資料管理和操作。其中之一就是規則(rules),它是一種用於控制在資料庫中處理查詢和命令的機制。在這篇文章中,我們將探討 PostgreSQL 規則的工作原理,以及它們與觸發器(triggers)的不同之處,並使用免費的 DVD 租賃資料庫 進行示範。
PostgreSQL 規則是什麼?
PostgreSQL 規則提供了一種在執行查詢或命令之前重寫它們的方法。它們作為一組預先定義的操作,根據某些條件自動執行。規則主要用於實現資料抽象化和定制,而不需修改底層架構。
此外,PostgreSQL 規則提供了一種強大的機制,可以在資料庫本身內強制執行業務邏輯,減少對應用程式層級條件約束的需求,並確保在不同應用程式或介面中的資料操作是一致的。透過將複雜的邏輯封裝在資料庫內,規則可以提高資料的完整性和可維護性,同時簡化了開發程序。
規則與觸發器有何不同?
在 PostgreSQL 中,規則和觸發器雖然具有相似的用途,但兩者之間存在著明顯的差異。
- 執行時間:
- 規則:規則在查詢解析期間套用,這意味著它們會影響查詢計劃的產生。
- 觸發器:觸發器在 INSERT、UPDATE 或 DELETE 等事件完成後執行。
- 可見度:
- 規則:對於執行查詢的使用者而言,規則是透明的。重寫後的查詢在查詢執行計劃中是可見的。
- 觸發器:觸發器是在資料表中明確定義的,由特定事件觸發。
- 資料粒度:
- 規則:規則可以應用於資料表層級或檢視層級,提供更大的客製化彈性。
- 觸發器:觸發器與特定資料表綁定,無法在全域範圍應用。
- 複雜性:
- 規則:規則可以很複雜,可能涉及多個操作或條件。
- 觸發器:觸發器更容易實施和管理,因為它們是事件驅動的。
使用「dvdrental」範例資料庫的實際範例:強制執行資料驗證
讓我們透過一個實際例子來了解 PostgreSQL 規則是如何與「dvdrental」範例資料庫結合使用。
假設我們想要強制執行一個條件約束,即租借期必須至少為一天。我們可以使用規則來實現這一點:
CREATE RULE enforce_min_rental_duration AS
ON INSERT TO rental
WHERE (NEW.return_date - NEW.rental_date) < INTERVAL '1 day'
DO INSTEAD NOTHING;
在 Navicat 中,我們可以在資料表設計器的「規則」索引標籤中新增一個規則。「代替執行」下拉式清單可以選擇「INSTEAD」或「ALSO」。同時,在「位置」文本方塊輸入執行規則的條件,而「定義」方塊則可輸入規則應該執行的操作。以下是在 Navicat 中完整的規則定義:
此規則可確保任何插入少於一天租借期的操作都會被阻止。
總結
PostgreSQL 規則是一個強大的工具,用於控制查詢執行和強制資料完整性。儘管與觸發器相似,但在執行時間、可見性、資料粒度和複雜性方面,規則提供了獨特的優勢。透過了解規則和觸發器之間的差異並利用它們的功能,開發人員可以有效地自訂資料庫行為,以滿足特定的需求,同時保持資料的完整性和安全性。
有興趣試用 Navicat 16 for PostgreSQL 嗎?你可以在 此處 下載完整功能的應用程式,並獲得 14 天的免費試用!