如何在AWS Aurora RDS Postgres中创建用户定义的函数

时间:2019-09-18 14:11:46

标签: postgresql rds aurora

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

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

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

foreach (var name in doc.Descendants("Name").ToList())
{
    var attr = new XElement("Attribute",
        new XAttribute("name", "Name"), name.Value);
    name.ReplaceWith(attr);
}

以下内容使我可以创建该函数,但由于它没有主体,因此无法使用。

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

1 个答案:

答案 0 :(得分:1)

我们遇到了同样的问题,并与AWS联系,后者确认Query Editor工具确实存在问题。他们没有何时解决问题的预计到达时间。

解决方案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

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