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)
还有什么我没有想到的吗?
您不能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 zone
:created_at timestamptz DEFAULT current_timestamp
。看: