32.37. triggers

視圖 triggers 包含所有定義在當前數據庫,並且屬于當前用戶的觸發器。 (表的所有者也是觸發器的所有者。)

Table 32-35. triggers 字段

名字數據類型描述
trigger_catalogsql_identifier包含該觸發器的數據庫名字(總是當前數據庫)
trigger_schemasql_identifier包含該觸發器的模式名字
trigger_namesql_identifier觸發器名字
event_manipulationcharacter_data 激發觸發器的事件((INSERTUPDATE,或者DELETE
event_object_catalogsql_identifier 觸發器定義所在的表所在的數據庫名字(總是當前數據庫)
event_object_schemasql_identifier包含觸發器定義所在表的模式的名字
event_object_namesql_identifier觸發器定義所在的表的名字
action_ordercardinal_number尚未實現
action_conditioncharacter_data應用于一個 PostgreSQL 裡沒有的特性
action_statementcharacter_data 觸發器執行的語句(目前總是 EXECUTE PROCEDURE function(...)
action_orientationcharacter_data 標識觸發器是對處理的每一行激發還是對每個語句(ROW 或者 STATEMENT
condition_timingcharacter_data 觸發器觸發的時間(BEFORE 或者 AFTER
condition_reference_old_tablesql_identifier應用于一個 PostgreSQL 裡沒有的特性
condition_reference_new_tablesql_identifier應用于一個 PostgreSQL 裡沒有的特性

PostgreSQL 裡面的觸發器在影響到信息模式的表現形式方面, 與 SQL 標準有兩處不同。首先,在 PostgreSQL 裡,觸發器名字是表本地的對象, 兒不是獨立的模式對象。因此,我們可以在一個模式裡定義重復的觸發器名字,只要他們屬于不同的表。 (trigger_catalogtrigger_schema 實際上是用于觸發器定義所在表的名字。) 第二,PostgreSQL 裡的觸發器可以定義為在多個事件上觸發(比如 ON INSERT OR UPDATE), 而 SQL 標準只允許一個。如果一個觸發器定義為在多個事件上觸發,那麼在信息模式裡它會表現為多行, 每個事件一行。因為這兩個原因,視圖 triggers 的主鍵實際上是 (trigger_catalog, trigger_schema, trigger_name, event_object_name, event_manipulation), 而不是 (trigger_catalog, trigger_schema, trigger_name), 後者是 SQL 標準聲明的。當然,如果你定義一個遵循 SQL 標準的觸發器(觸發器名字在模式中唯一, 並且每個觸發器只有一個事件),這些事情不會煩著你。