2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

F.41. spi — 伺服器程式設計介面特性/示例 #

spi 模組提供了幾個可用的示例,演示瞭如何使用 伺服器程式設計介面 (SPI) 和觸發器。雖然這些函式本身就具有一定的價值,但它們更適合作為您修改以供自己使用的示例。這些函式足夠通用,可以與任何表一起使用,但您必須在建立觸發器時指定表名和欄位名(如下所述)。

下面描述的每組函式都作為獨立安裝的擴充套件提供。

F.41.1. refint — 實現參照完整性的函式 #

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 中有示例。

F.41.2. autoinc — 自增欄位的函式 #

autoinc() 是一個觸發器,它將序列的下一個值儲存到整數字段中。這與內建的“序列化列”功能有些重疊,但並不相同。該觸發器僅在欄位值為零或 null(在插入或更新行的 SQL 語句的操作之後)時替換該欄位的值。此外,如果序列的下一個值為零,nextval() 將被呼叫第二次以獲得非零值。

要使用它,請使用此函式建立一個 BEFORE INSERT(或可選的 BEFORE INSERT OR UPDATE)觸發器。指定兩個觸發器引數:要修改的整數列的名稱,以及將提供值的序列物件的名稱。(實際上,您可以指定任意數量的此類名稱對,如果您想更新多個自增列。)

autoinc.example 中有一個示例。

F.41.3. insert_username — 跟蹤誰更改了表的函式 #

insert_username() 是一個觸發器,它將當前使用者的名稱儲存到文字欄位中。這對於跟蹤誰最後修改了表中的特定行很有用。

要使用它,請使用此函式建立一個 BEFORE INSERT 和/或 UPDATE 觸發器。指定一個觸發器引數:要修改的文字列的名稱。

insert_username.example 中有一個示例。

F.41.4. moddatetime — 跟蹤最後修改時間的函式 #

moddatetime() 是一個觸發器,它將當前時間儲存到 timestamp 欄位中。這對於跟蹤表中特定行的最後修改時間很有用。

要使用它,請使用此函式建立一個 BEFORE UPDATE 觸發器。指定一個觸發器引數:要修改的列的名稱。該列的型別必須為 timestamptimestamp with time zone

moddatetime.example 中有一個示例。

提交更正

如果您在文件中發現任何不正確、與您的實際使用體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。