37.57.触发器
#
视图触发器
包含当前数据库中定义的所有触发器,这些触发器位于当前用户拥有或对其拥有除SELECT
之外的其他权限的表和视图上。
表 37.55.触发器
列
列类型 说明 |
---|
包含触发器的数据库的名称(始终为当前数据库) |
包含触发器的模式的名称 |
触发器的名称 |
触发触发器的事件( |
包含定义触发器的表的数据库的名称(始终为当前数据库) |
包含定义触发器的表的模式的名称 |
定义触发器的表的名称 |
在具有相同 |
触发器的 |
由触发器执行的语句(目前始终为 |
标识触发器是针对每行处理一次还是针对每条语句触发一次( |
触发器触发的时间( |
“旧”转换表的名称,如果没有,则为 null |
“新”转换表的名称,如果没有,则为 null |
适用于 PostgreSQL 中不可用的功能 |
适用于 PostgreSQL 中不可用的功能 |
适用于 PostgreSQL 中不可用的功能 |
PostgreSQL中的触发器与 SQL 标准有两处不兼容,这会影响信息架构中的表示。首先,在PostgreSQL中,触发器名称是每个表的局部名称,而不是独立的架构对象。因此,只要属于不同的表,就可以在一个架构中定义重复的触发器名称。(trigger_catalog
和trigger_schema
实际上是触发器定义所在的表的相关值。)其次,可以在PostgreSQL中定义触发器以在多个事件上触发(例如,ON INSERT OR UPDATE
),而 SQL 标准只允许一个事件。如果定义触发器在多个事件上触发,它将在信息架构中表示为多行,每种事件类型一行。由于这两个问题,视图triggers
的主键实际上是(trigger_catalog, trigger_schema, event_object_table, trigger_name, event_manipulation)
,而不是 SQL 标准指定的(trigger_catalog, trigger_schema, trigger_name)
。尽管如此,如果你以符合 SQL 标准的方式定义触发器(架构中触发器名称唯一,每个触发器只有一个事件类型),这不会影响你。
注意
在PostgreSQL9.1 之前,此视图的列action_timing
、action_reference_old_table
、action_reference_new_table
、action_reference_old_row
和action_reference_new_row
分别名为condition_timing
、condition_reference_old_table
、condition_reference_new_table
、condition_reference_old_row
和condition_reference_new_row
。这是 SQL:1999 标准中的命名方式。新命名符合 SQL:2003 及更高版本。