每个对象授予特权。您不能使用GRANT
/直接授予每行权限REVOKE
。
解决此问题的一种方法VIEW
是仅显示尚未提交的项目。简单的SELECT
权限,更复杂的UPDATE
/ DELETE
。您需要有关视图的INSTEAD
规则,这很棘手,尤其是对于初学者而言。
另一个明显的选择是您已经想到的,只是更简单。您不必实际撤销特权。只需为提交的项目抛出异常:
CREATE OR REPLACE FUNCTION trg_p_updelno()
RETURNS trigger AS
$func$
BEGIN
IF pg_has_role('other_group', 'member')
AND OLD.submission_date < now()::date THEN
RAISE EXCEPTION 'Too late, Kate! Project already submitted.';
END IF;
RETURN NULL;
END
$func$
LANGUAGE plpgsql;
CREATE TRIGGER updelno
BEFORE UPDATE OR DELETE ON project
FOR EACH ROW
EXECUTE PROCEDURE trg_p_updelno();
pg_has_role()
是访问权限查询功能之一,应该会派上用场。
当然,您希望阻止这些用户编辑提交日期。您也可以在触发器中执行此操作。但是在可以触发的触发函数中
引用时要小心,其中不存在。使用此处查看手册中的示例。NEW
ON DELETE
NEW
TG_OP