Postgresql

如何為帶有索引的 Postgres 表創建僅插入使用者?

  • June 9, 2021

這是我提出的架構:

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;

我知道我需要:

GRANT INSERT ON dbname.Surveys TO SurveyWriter;

但我是否還需要:

GRANT INSERT, UPDATE ON dbname.surveys_email_idx to SurveyWriter;

還有什麼我沒有想到的嗎?

您不能GRANT索引上使用。索引沒有單獨的權限,它們是擁有表的“實現細節”。

您已經涵蓋了INSERT特權(作為表所有者或超級使用者):

GRANT INSERT ON dbname.surveys TO SurveyWriter;

如果您希望角色登錄,它需要訪問數據庫。

GRANT CONNECT ON DATABASE my_database TO SurveyWriter;

另外,角色需要LOGIN特權CREATE USER隱含地這樣做。手冊:

CREATE USER現在是CREATE ROLE. 唯一的區別是,當命令拼寫時CREATE USERLOGIN預設假定為 ,

$$ … $$

並訪問pg_hba.conf.

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

您至少需要USAGE架構 - 預設情況下在public架構中給出,除非您撤銷它。您範例中的架構具有(誤導性!)名稱“dbname”。所以:

GRANT USAGE ON SCHEMA dbname TO SurveyWriter;

您不會混淆數據庫和模式,是嗎?看:

由於您使用 a serial,因此您至少還需要在USAGEconnected 上SEQUENCE

GRANT USAGE ON SEQUENCE public.surveys_id_seq TO SurveyWriter;

或者考慮一個IDENTITY列,而不需要單獨的權限。需要 Postgres 10 或更高版本。看:

有關的:


旁白 1:在任何地方

使用合法的小寫名稱以避免混淆。SurveyWriter將被創建為surveywriter. 我建議survey_writer改為。看:

旁白2:

考慮timestamp with time zonecreated_at timestamptz DEFAULT current_timestamp。看:

引用自:https://dba.stackexchange.com/questions/293978