您可以创建用户自定义操作,以定期在数据库上运行自定义函数或过程。
您可以使用 PostgreSQL 函数来创建通常需要多个查询或步骤的数据库操作。函数也可以被与数据库交互的其他应用程序使用,以执行任务而无需额外的代码。
您的函数需要包含在 CREATE
语句中。您也可以使用 CREATE OR REPLACE
,尽管不推荐这样做。此语句还允许您在此语句中定义命令的语言。用户自定义操作可以使用您选择的任何语言编写。本指南使用 SQL 过程语言 PL/pgSQL。
适用于用户自定义操作的函数的基本语法是
CREATE FUNCTION <function_name> (required arguments)RETURNS <return_datatype> AS $<variable_name>$DECLARE<declaration>;BEGIN<function_body>;RETURN { <variable_name> | value }END; LANGUAGE <language>;
这是一个返回数据库中表的总行数的函数示例。
使用此代码创建函数。请注意,job_id
和 config
是必需的参数。
CREATE FUNCTION totalRecords (job_id INT DEFAULT NULL, config JSONB DEFAULT NULL)RETURNS integer AS $total$declaretotal integer;BEGINSELECT count(*) into total FROM fill_measurements;RETURN total;END;$total$ LANGUAGE plpgsql;
当您在 psql 中执行此代码时,它会返回 CREATE FUNCTION
,表示已成功创建。然后,您可以像这样执行对函数的调用
select totalRecords();
结果如下所示
totalrecords--------------48600500(1 row)
创建函数后,您需要将其注册到作业调度器,以使函数定期运行。您可以使用 add_job
函数来完成此操作。此示例添加了 totalRecords
函数,并指示它每小时运行一次
SELECT add_job('totalRecords', '1h', config => '{"hypertable":"metr"}');
对于 config
值,如果您不需要任何特殊的配置参数,可以使用 NULL
。
您可以通过查询作业调度器来查看当前注册的所有作业的列表,如下所示
SELECT * FROM timescaledb_information.jobs;
结果如下所示
job_id | application_name | schedule_interval | max_runtime | max_retries | retry_period | proc_schema | proc_name | owner | scheduled | config | next_start | hypertable_schema | hypertable_name--------+----------------------------+-------------------+-------------+-------------+--------------+-----------------------+------------------+-----------+-----------+------------------------+-------------------------------+-------------------+-----------------1 | Telemetry Reporter [1] | 24:00:00 | 00:01:40 | -1 | 01:00:00 | _timescaledb_internal | policy_telemetry | postgres | t | | 2022-08-18 06:26:39.524065+00 | |1000 | User-Defined Action [1000] | 01:00:00 | 00:00:00 | -1 | 00:05:00 | public | totalrecords | tsdbadmin | t | {"hypertable": "metr"} | 2022-08-17 07:17:24.831698+00 | |(2 rows)
TimescaleDB 本身包含一些作业调度策略,例如
如果这些策略不能满足您的用例,或者您想扩展原生策略功能,则可以编写用户自定义操作。
关键词
在此页面上发现问题了吗?报告问题 或 在 GitHub 上编辑此页面。