Postgresql
如何為帶有索引的 Postgres 表創建僅插入使用者?
這是我提出的架構:
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 USER
,LOGIN
預設假定為 ,$$ … $$
並訪問
pg_hba.conf
.(否則,您可能想
SET ROLE
改用。)您至少需要
USAGE
架構 - 預設情況下在public
架構中給出,除非您撤銷它。您範例中的架構具有(誤導性!)名稱“dbname”。所以:GRANT USAGE ON SCHEMA dbname TO SurveyWriter;
您不會混淆數據庫和模式,是嗎?看:
由於您使用 a
serial
,因此您至少還需要在USAGE
connected 上SEQUENCE
:GRANT USAGE ON SEQUENCE public.surveys_id_seq TO SurveyWriter;
或者考慮一個
IDENTITY
列,而不需要單獨的權限。需要 Postgres 10 或更高版本。看:有關的:
旁白 1:在任何地方
使用合法的小寫名稱以避免混淆。
SurveyWriter
將被創建為surveywriter
. 我建議survey_writer
改為。看:旁白2:
考慮
timestamp with time zone
:created_at timestamptz DEFAULT current_timestamp
。看: