PostgreSQL 的“行级权限”总开关,开了以后每行都要通过策略检查才能被看见/改写
-- 启用
ALTER TABLE conversations ENABLE ROW LEVEL SECURITY;
-- 关闭
ALTER TABLE conversations DISABLE ROW LEVEL SECURITY;
为某张表、某种操作(SELECT
、INSERT
、UPDATE
、DELETE
)定义布尔规则,决定哪些行可见或可修改。
-- 语法
CREATE POLICY policy_name
ON table_name
FOR { SELECT | INSERT | UPDATE | DELETE | ALL }
[ TO role [, ...] ]
[ USING ( boolean_expression ) ]
[ WITH CHECK ( boolean_expression ) ];
-- 示例
CREATE POLICY "members-can-access"
ON conversations
FOR ALL
USING (
EXISTS (
SELECT 1 FROM conversation_members
WHERE conversation_id = conversations.id
AND user_id = auth.uid()
)
);
CREATE POLICY policy_name
ON table_name
FOR { ALL | SELECT | INSERT | UPDATE | DELETE }
[ TO { role_name | PUBLIC | authenticated | anon | ... } [, ...] ]
[ USING ( expression ) ]
[ WITH CHECK ( expression ) ];
PUBLIC
,也就是所有人)alter table table_name enable row level security;
必须开启才有效CREATE POLICY policy_name
ON projects
FOR SELECT
USING (
EXISTS (
SELECT 1
FROM project_members
WHERE
project_members.project_id = projects.id AND
project_members.user_id = auth.uid()
)
)