該 spi 模組提供了幾個可用的示例,演示瞭如何使用 伺服器程式設計介面 (SPI) 和觸發器。雖然這些函式本身就具有一定的價值,但它們更適合作為您修改以供自己使用的示例。這些函式足夠通用,可以與任何表一起使用,但您必須在建立觸發器時指定表名和欄位名(如下所述)。
下面描述的每組函式都作為獨立安裝的擴充套件提供。
check_primary_key()
和 check_foreign_key()
用於檢查外部索引鍵約束。(當然,此功能早已被內建的外部索引鍵機制取代,但該模組仍可作為示例使用。)
check_primary_key()
檢查引用表。要使用它,請在引用另一個表的表上使用此函式建立一個 AFTER INSERT OR UPDATE
觸發器。在觸發器引數中指定:構成外部索引鍵的引用表的列名、被引用表名以及被引用表中構成主鍵/唯一鍵的列名。要處理多個外部索引鍵,請為每個引用建立一個觸發器。
check_foreign_key()
檢查被引用表。要使用它,請在被其他表引用的表上使用此函式建立一個 AFTER DELETE OR UPDATE
觸發器。在觸發器引數中指定:函式需要執行檢查的引用表的數量,如果找到引用鍵時的操作(cascade
— 刪除引用行,restrict
— 如果存在引用鍵,則中止事務,setnull
— 將引用鍵欄位設定為 null),觸發表的列名,這些列構成主鍵/唯一鍵,然後是引用表名和列名(根據第一個引數指定的引用表的數量重複)。請注意,主鍵/唯一鍵列應標記為 NOT NULL 並應具有唯一索引。
請注意,如果這些觸發器是從另一個 BEFORE
觸發器執行的,它們可能會意外失敗。例如,如果使用者插入 row1,然後 BEFORE
觸發器插入 row2 並呼叫帶有 check_foreign_key()
的觸發器,那麼 check_foreign_key()
函式將看不到 row1 並會失敗。
在 refint.example
中有示例。
autoinc()
是一個觸發器,它將序列的下一個值儲存到整數字段中。這與內建的“序列化列”功能有些重疊,但並不相同。該觸發器僅在欄位值為零或 null(在插入或更新行的 SQL 語句的操作之後)時替換該欄位的值。此外,如果序列的下一個值為零,nextval()
將被呼叫第二次以獲得非零值。
要使用它,請使用此函式建立一個 BEFORE INSERT
(或可選的 BEFORE INSERT OR UPDATE
)觸發器。指定兩個觸發器引數:要修改的整數列的名稱,以及將提供值的序列物件的名稱。(實際上,您可以指定任意數量的此類名稱對,如果您想更新多個自增列。)
在 autoinc.example
中有一個示例。
insert_username()
是一個觸發器,它將當前使用者的名稱儲存到文字欄位中。這對於跟蹤誰最後修改了表中的特定行很有用。
要使用它,請使用此函式建立一個 BEFORE INSERT
和/或 UPDATE
觸發器。指定一個觸發器引數:要修改的文字列的名稱。
在 insert_username.example
中有一個示例。
moddatetime()
是一個觸發器,它將當前時間儲存到 timestamp
欄位中。這對於跟蹤表中特定行的最後修改時間很有用。
要使用它,請使用此函式建立一個 BEFORE UPDATE
觸發器。指定一個觸發器引數:要修改的列的名稱。該列的型別必須為 timestamp
或 timestamp with time zone
。
在 moddatetime.example
中有一個示例。
如果您在文件中發現任何不正確、與您的實際使用體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。