spi 模块提供了一些使用服务器编程接口(SPI)和触发器的可行示例。虽然这些函数本身就有一定的价值,但作为修改以满足您自己用途的示例,它们更有用。这些函数足够通用,可以用于任何表,但您必须在创建触发器时指定表和字段名称(如下所述)。
下面描述的每组函数都作为单独安装的扩展提供。
check_primary_key() 和 check_foreign_key() 用于检查外键约束。(当然,此功能早已被内置的外键机制所取代,但该模块仍然可以用作示例。)
check_primary_key() 检查引用表。要使用,请在引用另一个表的表上使用此函数创建一个 BEFORE INSERT OR UPDATE 触发器。将以下内容指定为触发器参数:构成外键的引用表的列名、被引用表的名称以及被引用表中构成主/唯一键的列名。要处理多个外键,请为每个引用创建一个触发器。
check_foreign_key() 检查被引用表。要使用,请在被其他表引用的表上使用此函数创建一个 BEFORE DELETE OR UPDATE 触发器。将以下内容指定为触发器参数:该函数必须执行检查的引用表的数量、如果找到引用键时的操作(cascade — 删除引用行,restrict — 如果存在引用键则中止事务,setnull — 将引用键字段设置为 null)、触发表的构成主/唯一键的列名,然后是引用表的名称和列名(对于第一个参数指定的引用表,重复多次)。请注意,主/唯一键列应标记为 NOT NULL,并且应具有唯一索引。
在 refint.example 中有示例。
autoinc() 是一个触发器,它将序列的下一个值存储到整数字段中。这与内置的“序列列”功能有一些重叠,但并不相同:autoinc() 将覆盖在插入期间替换不同字段值的尝试,并且可以选择在更新期间也用于递增该字段。
要使用,请使用此函数创建一个 BEFORE INSERT(或可选的 BEFORE INSERT OR UPDATE)触发器。指定两个触发器参数:要修改的整数列的名称,以及将提供值的序列对象的名称。(实际上,如果想要更新多个自动递增列,您可以指定任意数量的此类名称对。)
在 autoinc.example 中有示例。
insert_username() 是一个触发器,它将当前用户的名称存储到文本字段中。这对于跟踪谁最后修改了表中的特定行非常有用。
要使用,请使用此函数创建一个 BEFORE INSERT 和/或 UPDATE 触发器。指定一个触发器参数:要修改的文本列的名称。
在 insert_username.example 中有示例。
moddatetime() 是一个触发器,它将当前时间存储到 timestamp 字段中。这对于跟踪表中特定行的最后修改时间非常有用。
要使用,请使用此函数创建一个 BEFORE UPDATE 触发器。指定一个触发器参数:要修改的列的名称。该列的类型必须为 timestamp 或 timestamp with time zone。
在 moddatetime.example 中有示例。
如果您在文档中看到任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表单报告文档问题。