0

我目前正在使用 Postgresql 创建数据库。第一次,温柔点。;)

我有一个表project,其中存储提交日期等。

我有 2 组用户。只能查阅数据库,没有更新/插入/删除权限,所以很简单。

另一组有权对他们的项目做任何他们想做的事情,但仅限于提交日期。

我正在寻找一种很好的方法来做到这一点。

我想到了一个触发器函数,它检查current_date存储在数据库中的日期和日期,如果通过,则撤销权限,然后引发异常'您不再有权修改该项目。我可以在所有桌子上使用相同的触发器。我认为这可行,但我不知道这是否是正确/好方法。

PS:如果有人也有一些关于 1..* 到 0..* 关系的提示......</p>

4

2 回答 2

1

每个对象授予特权。您不能使用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()访问权限查询功能之一,应该会派上用场。

当然,您希望阻止这些用户编辑提交日期。您也可以在触发器中执行此操作。但是在可以触发的触发函数中
引用时要小心,其中不存在。使用此处查看手册中的示例NEWON DELETENEWTG_OP

于 2013-05-20T21:52:18.157 回答
0

您可以考虑的一件事是,如果第二组在特定日期之后将无法访问数据库,那么您可以在那时撤销他们的登录权限。请注意如何取决于身份验证细节,但如果是密码登录,您只需:

ALTER USER foo VALID UNTIL '2013-07-01';

请注意,这只会使密码过期。然后,您可以有一个定期执行的 cron 作业并清理过期的用户(信息在 pg_authid 系统表中)。

如果用户仍然可以访问 PostgreSQL 实例,您将需要接受 Erwin 的建议。

于 2013-06-07T07:59:07.167 回答