视图 triggers 包含所有定义在当前数据库,并且属于当前用户的触发器。 (表的所有者也是触发器的所有者。)
Table 30-35. triggers 字段
名字 | 数据类型 | 描述 |
---|---|---|
trigger_catalog | sql_identifier | 包含该触发器的数据库名字(总是当前数据库) |
trigger_schema | sql_identifier | 包含该触发器的模式名字 |
trigger_name | sql_identifier | 触发器名字 |
event_manipulation | character_data | 激发触发器的事件((INSERT,UPDATE,或者DELETE) |
event_object_catalog | sql_identifier | 触发器定义所在的表所在的数据库名字(总是当前数据库) |
event_object_schema | sql_identifier | 包含触发器定义所在表的模式的名字 |
event_object_name | sql_identifier | 触发器定义所在的表的名字 |
action_order | cardinal_number | 尚未实现 |
action_condition | character_data | 应用于一个PostgreSQL 里没有的特性 |
action_statement | character_data | 触发器执行的语句(目前总是 EXECUTE PROCEDURE function(...)) |
action_orientation | character_data | 标识触发器是对处理的每一行激发还是对每个语句(ROW 或者 STATEMENT) |
condition_timing | character_data | 触发器触发的时间(BEFORE 或者 AFTER) |
condition_reference_old_table | sql_identifier | 应用于一个PostgreSQL 里没有的特性 |
condition_reference_new_table | sql_identifier | 应用于一个PostgreSQL 里没有的特性 |
PostgreSQL 里面的触发器在影响到信息模式的表现形式方面, 与 SQL 标准有两处不同。首先,在 PostgreSQL 里,触发器名字是表本地的对象, 儿不是独立的模式对象。因此,我们可以在一个模式里定义重复的触发器名字,只要他们属于不同的表。 (trigger_catalog 和 trigger_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 标准的触发器(触发器名字在模式中唯一, 并且每个触发器只有一个事件),这些事情不会烦着你。