30.37. triggers

視圖 triggers 包含所有定義在目前資料庫,並且屬於目前用戶的觸發器。 (資料表的所有者也是觸發器的所有者。)

Table 30-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 標準的觸發器(觸發器名字在模式中唯一, 並且每個觸發器只有一個事件),這些事情不會煩著您。