提问人:Jacopo Russo 提问时间:7/25/2019 最后编辑:Jacopo Russo 更新时间:7/25/2019 访问量:4513
获取标识列的 nextval
getting nextval for identity column
问:
在我的 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”的“隐藏”基础序列。这是对的吗?
答: 暂无答案
评论
nextval()
usage
identity
identity
select pg_get_serial_sequence('app', 'apps_id')