首页 > 解决方案 > 如何在 AWS Aurora RDS Postgres 中创建用户定义的函数

问题描述

(为简单起见格式化问题)

我正在使用 AWS RDS Aurora Postgres 10.7(这是我的 us-west-2 区域可用的最新版本)。我在无服务器模式下使用它,因此我在 AWS 控制台中嵌入了查询编辑器来运行我的查询。我需要编写用户定义的函数来执行某些复杂的数据库操作。我在我的本地 Postgres 实例上进行了尝试,它工作正常,但是,在 AWS 上我无法创建函数。

以下导致错误:错误:“END”处或附近的语法错误。请注意,在“return 1”之后添加分号也会导致错误。

CREATE OR REPLACE function some_function()
  RETURNS integer AS
$BODY$
Begin
    return 1
End
$BODY$
  LANGUAGE 'plpgsql';

而下面的内容让我创建了该函数,但由于它没有主体,因此无法使用。

CREATE OR REPLACE function some_function()
  RETURNS integer AS
$BODY$
Begin
End
$BODY$
  LANGUAGE 'plpgsql';

My questions is: Has anyone used AWS RDS Query Editor to create user-defined functions in Aurora Postgres? Is yes, what part of syntax is wrong in the example above.

标签: postgresqlrdsamazon-aurora

解决方案


我们遇到了同样的问题并与 AWS 取得了联系,后者确认这确实是查询编辑器工具的问题。他们没有关于何时解决问题的 ETA。

解决方案 1:使用 psql

好消息是这将适用于psql. 这是他们回复电子邮件的一个片段:

$ psql -h database-2.cluster-xx.us-west-2.rds.amazonaws.com -d postgres -U postgres
postgres=> CREATE OR REPLACE FUNCTION trigger_set_updated_at() RETURNS TRIGGER AS $$
postgres$> BEGIN  NEW.updated_at = NOW();  
postgres$> RETURN NEW;END;$$ 
postgres-> LANGUAGE plpgsql;
CREATE FUNCTION

有关如何设置的文档:https ://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToPostgreSQLInstance.html

解决方案 2:使用数据 API

我们已经使用Data API与我们的集群进行通信,因此对我们来说最简单的解决方案实际上是使用 AWS CLI 和现有的数据库密钥。

您可以将函数定义放在一个function.sql文件中:

CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
    BEGIN
        RETURN i + 1;
    END;
$$ LANGUAGE plpgsql;

然后在数据库上执行它:

cat function.sql | xargs -0 aws rds-data execute-statement \
    --resource-arn arn:aws:rds:eu-west-1:xxx:cluster:cluster-name \
    --secret-arn arn:aws:secretsmanager:eu-west-1:xxx:secret:secret-name-xxx \
    --database "database_name" \
    --sql

希望这是有用的,祝你好运!


推荐阅读