3

在我的 postgreSQL DB 应用程序中,有时我需要在运行插入之前检索序列的下一个值。我曾经通过向我的用户授予对此类序列的“使用”权限并使用“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”连接,并且可以使用“<em>nextval”函数来检索序列的下一个键。如果我改用标识列,如果我作为 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'的“隐藏”基础序列。这样对吗?

4

0 回答 0