在我的 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'的“隐藏”基础序列。这样对吗?