如何在 Amazon RDS PostgreSQL 上创建 INOUT 分配转换?如果不可能,那为什么?

Pio*_*sen 7 postgresql cast amazon-rds

我正在将现有应用程序迁移到 Amazon RDS PostgreSQL。该应用程序具有跨数据库支持,出于兼容性原因,它包含以下 SQL:

CREATE CAST (varchar AS numeric) WITH INOUT AS ASSIGNMENT
Run Code Online (Sandbox Code Playgroud)

在普通 PostgreSQL 上,这需要超级用户。在 Amazon RDS PostgreSQL 上这失败了

错误:必须是类型字符变化或数字类型的所有者

  • 有没有办法在 Amazon RDS 中创建这样的演员表(也许通过管理 Web 界面)?
  • 如果这是不可能的,那为什么?这是故意限制(例如演员是危险的)还是只是一个缺失的功能?

注意:我猜这是否是赋值或隐式转换无关紧要,但为了完整性而包含此信息。

Erw*_*ter 0

现代 Postgres 和 Amazon RDS 中的限制相同。根据文档

为了能够创建强制转换,您必须拥有源或目标数据类型USAGE,并对其他类型拥有特权。要创建二进制强制转换,您必须是超级用户。(做出此限制是因为错误的二进制强制转换很容易导致服务器崩溃。)

大胆强调我的。由于所有基本类型(包括varcharnumeric)都由超级用户 postgres 所有(默认情况下),因此您需要有效地成为超级用户。如果您已经尝试过postgres,我们可以得出结论,Amazon RDS 在后台拥有另一个超级用户角色,拥有这些类型(可能还有整个核心系统)。

Amazon RDS 在线手册指出了以下内容:

创建数据库实例时,您创建的主用户系统帐户将分配给 rds_superuser 角色。rds_superuser 角色是预定义的 Amazon RDS 角色,类似于 PostgreSQL 超级用户角色(在本地实例中通常命名为 postgres),但有一些限制。

大胆强调我的。

  • 我懂了。因此,为了允许非超级用户创建强制转换,我需要首先“将类型 <t> 所有者更改为 <u>”?我想知道为什么 RDS 不将所有类型的所有者更改为“rds_superuser”。 (2认同)