是否可以将枚举类型从一个模式复制到另一个模式

Is it possible to copy an enum type from one schema to another

我正在使用 postgREST 生成可访问的 http api(很棒的东西)。我正在尝试解决一个小错误。

无论出于何种原因,在调用函数时,并且仅在函数参数中,我不能使用 api 通常可以使用限定符号引用的类型,例如 core.my_type。但是它可以访问 api.my_type 当然我不需要限定类型。

所以,要清楚,这一切都适用于 postgres。这只是 postgREST 的一个怪癖。

随着时间的推移容易出错的一种变通方法是copy/paste每个模式中每种类型的定义。

另一个是这个 post 的主题:有没有办法自动将 core 模式中的类型复制到 api 中的类型?或者,有没有办法使用别名来引用 core.my_type? (不确定后者是否能解决问题,但也许值得一试)。

我意识到这需要在需要的地方进行转换。但是,它确实解决了跟踪每个 enums(在本例中)中的条目的问题。

For whatever reason, when calling a function, and only in the function parameters, I cannot use the types the api can normally reference using qualified notation

这是因为 PostgREST 在构建查询以调用函数时使用 CTE,并将数据转换为 these lines of code 中所见的参数类型。

有一个 closed issue in the GitHub repository 提到了这个标记为 won't fix 的问题。

The other is the topic of this post: is there a way to automatically create a copy of the type in the core schema to one in the api? Or, is there a way to reference the core.my_type using an alias?

您可以 create a DOMAIN 作为解决方法。这样,您使用 ALTER 对基础私有数据类型所做的任何修改都将反映在域中。例如:

create schema api;
create schema private;
create role web_anon nologin;
-- web_anon doesn't have usage on the private schema
grant usage on schema api to web_anon;

-- create type and domain
create type private.grade as enum('a','b','c','d','e');
create domain api.grade as private.grade;

-- The function uses the domain api.grade instead of private.grade
create or replace function
  api.get_grade(g api.grade) returns text as $$
begin
  return (select g);
end;
$$ language plpgsql;

-- This change will reflect on the domain
alter type private.grade add value 'f';