9.3 9.4 9.5 9.6 10 11 12 13 14 15 16 17 Current(18)
PostgreSQL中文社区 问题报告 纠错本页面

F.41. spi — 服务器编程接口功能/示例 #

F.41.1. refint — 用于实现参照完整性的函数
F.41.2. autoinc — 自增字段的函数
F.41.3. insert_username — 用于跟踪谁修改了一个表的函数
F.41.4. moddatetime — 用于跟踪最后修改时间的函数

spi模块提供了多个可工作的使用服务器编程接口 (SPI) 和触发器的例子。尽管这些函数本身有一定的价值, 但它们作为修改以满足你自己需求的示例更为有用。这些函数足够通用,可以与任何表一起使用, 但在创建触发器时你必须指定表名和字段名(如下所述)。

下面描述的函数组中的每一个都作为一个独立可安装的扩展提供。

F.41.1. refint — 用于实现参照完整性的函数 #

check_primary_key()check_foreign_key()用于检查外键约束。 (当然,这个功能早已被内建的外键机制取代,但该模块仍然作为示例有用。)

check_primary_key()检查引用表。 使用时,在引用另一个表的表上创建一个 AFTER INSERT OR UPDATE 触发器,使用此函数。 作为触发器参数指定:形成外键的引用表的列名,引用的表名,以及 在引用表中形成主键/唯一键的列名。要处理多个外键, 为每个引用创建一个触发器。

check_foreign_key()检查被引用的表。 使用时,在被其他表引用的表上创建一个 AFTER DELETE OR UPDATE 触发器,使用此函数。 作为触发器参数指定:需要进行检查的引用表的数量,如果找到引用键的操作 (cascade — 删除引用行, restrict — 如果存在引用键则中止事务, setnull — 将引用键字段设置为 null), 被触发表的列名,这些列形成主键/唯一键,然后是引用表的名称和列名 (根据第一个参数指定的引用表数量重复)。请注意,主键/唯一键列应标记为 NOT NULL,并且应具有唯一索引。

请注意,如果这些触发器是从另一个 BEFORE 触发器中执行的,它们可能会意外失败。 例如,如果用户插入 row1,然后 BEFORE 触发器插入 row2 并调用带有 check_foreign_key() 的触发器, check_foreign_key() 函数将无法看到 row1 并会失败。

refint.example 中有一些例子。

F.41.2. autoinc — 自增字段的函数 #

autoinc() 是一个触发器,将序列的下一个值存储到一个整数字段中。 这与内置的 serial column 特性有一些重叠,但并不相同。 只有在该值最初为零或 null(在插入或更新行的 SQL 语句执行后)时,触发器才会替换字段的值。 此外,如果序列的下一个值为零,将第二次调用 nextval() 以获取非零值。

用法是使用这个函数创建一个 BEFORE INSERT(或者 BEFORE INSERT OR UPDATE)触发器。指定两个触发器参数:要被修改的整数列名和将提供值的序列对象名(事实上,如果你想要更新多于一个自增列,你可以指定任意数量的这种名称对)。

autoinc.example 中有一个例子。

F.41.3. insert_username — 用于跟踪谁修改了一个表的函数 #

insert_username() 是一个触发器,将当前用户名存储到一个文本字段中。 这有助于跟踪是谁最后在一个表中修改了一个特定行。

用法是使用这个函数创建一个BEFORE INSERT和/或UPDATE触发器。指定一个触发器参数:要被修改的文本列名。

insert_username.example中有一个例子。

F.41.4. moddatetime — 用于跟踪最后修改时间的函数 #

moddatetime()是一个存储当前时间到一个timestamp字段的触发器。它有助于跟踪一个表中特定行最后一次的修改时间。

用法是使用这个函数创建一个BEFORE UPDATE触发器。指定一个触发器参数:要被修改的列名。该列必须是类型timestamptimestamp with time zone

moddatetime.example中有一个例子。