本節書摘來自華章計算機《postgresql伺服器程式設計》一書中的第1章,第1.4節,作者:(美)hannu krosing, jim mlodgenski, kirk roybal 著,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
伺服器程式設計也包括了對自動化的動作(觸發器)的設定。設定了自動化動作後,資料庫中的一些操作便可觸發其他一些事情也跟随發生。例如,你可以設定一個處理過程,一邊對一些商品進行供給,一邊在庫存表裡進行自動預訂處理。
是以,讓我們建立一個水果庫存表:
這裡,check限制對一些基本規則的執行進行了限制:你不能有多于1000的水果庫存(太多了可能會壞掉),你也不能有負的庫存,同時你不能為别人供給多餘目前庫存的水果。
這個offer表為每次供給設定一個id(保證你可以區分以後的每一次供給)、接收者、日期、供給水果的名稱和供應數量。
為了完成自動化的庫存管理,你首先需要一個觸發器函數。這個函數可以實作管理邏輯:
你必須告訴postgresql,在每次供應行被改變的時候,調用這個函數:
這步完成之後,我們準備測試一下它的功能。首先,我們将添加一些水果到庫存中:
然後,我們核對這個庫存(這裡使用擴充顯示):
接下來,我們進行一次供應動作,将100個蘋果供應給bob:
在核對庫存這一步,我們看到100個蘋果确實已經預訂了:
如果我們改變了供應數量,預訂情況就會跟着變化:
我們也獲得了一些額外的好處。首先,因為庫存表上的限制,你不能賣出已經預訂的蘋果:
更有趣的是,雖然這個限制是在另外一張表上,但是你也不能預訂超出你現有數量的蘋果:
當你最終決定删除供應的時候,之前的預訂則會被解除:
在現實的系統中,你可能在删除之前,要先擷取之前的供應情況。