数据库

数据库Webhooks

在数据库事件上触发外部负载。


数据库 Webhook 允许您在表事件发生时,将实时数据从数据库发送到其他系统。

您可以监听三种表事件:INSERT(插入)、UPDATE(更新)和 DELETE(删除)。所有事件都是在数据库行变更_之后_触发的。

Webhook 与触发器的区别

数据库 Webhook 与触发器非常相似,这是因为数据库 Webhook 实际上是基于 pg_net 扩展的触发器封装。该扩展是异步的,因此不会因为长时间的网络请求而阻塞您的数据库变更。

以下视频演示了如何在每次向 profiles 表插入行时,在 Stripe 中创建新客户:

创建 Webhook

  1. 在 Dashboard 中创建新的 数据库 Webhook
  2. 为您的 Webhook 命名
  3. 选择要监听的目标表
  4. 选择要监听的一个或多个事件(表插入、更新或删除)

由于 Webhook 本质上是数据库触发器,您也可以直接通过 SQL 语句创建:

1
2
3
4
5
6
7
8
9
create trigger "my_webhook" after inserton "public"."my_table" for each rowexecute function "supabase_functions"."http_request"( 'http://host.docker.internal:3000', 'POST', '{"Content-Type":"application/json"}', '{}', '1000');

目前我们支持 HTTP Webhook。这些请求可以以 POSTGET 方式发送,并携带 JSON 负载。

负载数据

负载数据会自动从底层表记录生成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type InsertPayload = { type: 'INSERT' table: string schema: string record: TableRecord<T> old_record: null}type UpdatePayload = { type: 'UPDATE' table: string schema: string record: TableRecord<T> old_record: TableRecord<T>}type DeletePayload = { type: 'DELETE' table: string schema: string record: null old_record: TableRecord<T>}

监控

Webhook调用的日志历史记录可在数据库的net模式中查看。更多信息请参阅GitHub仓库

本地开发

在本地Supabase实例中使用数据库Webhooks时,需要注意Postgres数据库运行在Docker容器内。这意味着webhook URL中的localhost127.0.0.1会指向容器本身,而不是运行应用程序的宿主机。

要访问宿主机上运行的服务,请使用host.docker.internal。如果无效,可能需要改用机器的本地IP地址。

例如,如果您想在webhook触发时调用边缘函数,webhook URL应为:

1
http://host.docker.internal:54321/functions/v1/my-function-name

如果在本地遇到webhook连接问题,请确认使用的是正确的主机名而非localhost

相关资源

  • pg_net: 用于Postgres的异步网络扩展