如何为带有索引的 Postgres 表创建仅插入用户?

dan*_*sky 5 schema postgresql permissions

这是我建议的架构:

CREATE TABLE Surveys (
    id serial primary key,
    user_email citext,
    survey_data jsonb,
    created_at timestamp default current_timestamp
);
CREATE INDEX surveys_email_idx ON Surveys(user_email);

CREATE USER SurveyWriter;
Run Code Online (Sandbox Code Playgroud)

我知道我需要:

GRANT INSERT ON dbname.Surveys TO SurveyWriter;
Run Code Online (Sandbox Code Playgroud)

但我还需要:

GRANT INSERT, UPDATE ON dbname.surveys_email_idx to SurveyWriter;
Run Code Online (Sandbox Code Playgroud)

还有什么我没有想到的吗?

Erw*_*ter 8

您不能GRANT索引上使用。索引没有单独的权限,它们是所属表的“实现细节”。

您已经涵盖了INSERT特权(作为表所有者或超级用户):

GRANT INSERT ON dbname.surveys TO SurveyWriter;
Run Code Online (Sandbox Code Playgroud)

如果您希望角色登录,则它需要访问数据库。

GRANT CONNECT ON DATABASE my_database TO SurveyWriter;
Run Code Online (Sandbox Code Playgroud)

另外,角色需要LOGIN特权CREATE USER隐含地这样做。手册:

CREATE USER现在是 的别名CREATE ROLE。唯一的区别是,当命令拼写为CREATE USER,LOGIN默认情况下, [...]

并在pg_hba.conf.

(否则您可能想SET ROLE改用。)

您至少需要USAGE架构 - 默认情况下在public架构中给出,除非您撤销它。您示例中的架构具有(误导!)名称“dbname”。所以:

GRANT USAGE ON SCHEMA dbname TO SurveyWriter;
Run Code Online (Sandbox Code Playgroud)

你不会混淆数据库和模式,是吗?看:

由于您使用 a serial,因此您至少还需要在USAGE已连接的SEQUENCE:

GRANT USAGE ON SEQUENCE public.surveys_id_seq TO SurveyWriter;
Run Code Online (Sandbox Code Playgroud)

或者考虑使用IDENTITY不需要单独权限的列。需要 Postgres 10 或更高版本。看:

有关的:


旁白 1:在任何地方
使用合法的小写名称以避免混淆。SurveyWriter将被创建为surveywriter. 我建议survey_writer改为。看:

旁白2:
考虑timestamp with time zonecreated_at timestamptz DEFAULT current_timestamp。看: