获取标识列的 nextval

getting nextval for identity column

提问人:Jacopo Russo 提问时间:7/25/2019 最后编辑:Jacopo Russo 更新时间:7/25/2019 访问量:4513

问:

在我的 postgreSQL 数据库应用程序中,我有时需要在运行插入之前检索序列的下一个值。 我曾经通过向我的用户授予此类序列的“使用”权限并使用“nextval”函数来实现这一点。 我最近开始使用“GENERATED BY DEFAULT AS IDENTITY”列作为主键,我仍然能够以超级用户身份检索 nextval,但我无法将此类权限授予其他用户。我的错在哪里?

下面是一个示例:

-- <sequence>
CREATE SEQUENCE public.apps_apps_id_seq
    INCREMENT 1
    START 1
    MINVALUE 1
    MAXVALUE 9223372036854775807
    CACHE 1;

ALTER SEQUENCE public.apps_apps_id_seq
    OWNER TO postgres;

GRANT USAGE ON SEQUENCE public.apps_apps_id_seq TO udocma;

GRANT ALL ON SEQUENCE public.apps_apps_id_seq TO postgres;
-- </sequence>

-- <table>
CREATE TABLE public.apps
(
    apps_id integer NOT NULL DEFAULT nextval('apps_apps_id_seq'::regclass),
    apps_born timestamp without time zone NOT NULL DEFAULT now(),
    apps_vrsn character varying(50) COLLATE pg_catalog."default",
    apps_ipad character varying(200) COLLATE pg_catalog."default",
    apps_dscr character varying(500) COLLATE pg_catalog."default",
    apps_date timestamp without time zone DEFAULT now(),
    CONSTRAINT apps_id_pkey PRIMARY KEY (apps_id)
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.apps
    OWNER to postgres;

GRANT INSERT, SELECT, UPDATE, DELETE ON TABLE public.apps TO udocma;
-- </table>

客户端应用程序作为“udocma”连接,可以使用“nextval”函数检索序列的下一个键。 如果我改用 identity 列,如果我以 postgres 身份记录,我仍然可以这样做,但如果我以 udocma 身份登录,我没有权限在为身份列生成值的“隐藏”序列上执行 nextval。

比你。我意识到这些陈述

GRANT USAGE ON SEQUENCE public.apps_apps_id_seq TO udocma;

select nextval('apps_apps_id_seq'::regclass);

如果我将apps.apps_id定义为标识列而不是序列,它们仍然有效。因此,我猜想在名为“sometable”的表中定义为标识列的名为“somefield”的字段应该具有一些名为“sometable_somefiled_seq”的“隐藏”基础序列。这是对的吗?

PostgreSQL 序列 标识 sql-grant nextval

评论

0赞 7/25/2019
你到底用了什么补助金? 应该可供表的所有者使用。对于其他人,您需要授予基础序列的权限nextval()usage
0赞 7/25/2019
我没有看到您在使用列时为该表所做的任何授权?identity
7赞 7/25/2019
是的,列也使用序列。您可以使用来获取该序列的名称identityselect pg_get_serial_sequence('app', 'apps_id')

答: 暂无答案