当列有默认值时防止查询分配 ID

Prevent query assigning ID when column has a default

我有一个 table,其中有一列定义为 id serial。因此,它在列上默认调用一个排序器。这就是我想要的。但是,我的老板(也是公司的所有者)坚持拥有对数据库的完全访问权限,并且喜欢在此 table 上编写自己的查询(包括插入)。更不幸的是,他似乎总是忘记应该为他自动生成这些 ID,并且他使用 max(id) + 1 创建记录。然后排序器与 table 和下次有人打电话给 API 我们会收到 500。

问题:鉴于我没有能力将他锁定在数据库之外,防止他这样做的最佳方法是什么?

我的第一个想法是创建一个插入前触发器,并在分配了 ID 时引发错误。这是我所做的:

CREATE OR REPLACE FUNCTION md.tf_no_manual_keys()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
DECLARE

BEGIN

    IF NEW.id IS NOT NULL THEN
        RAISE EXCEPTION 'ID must be assigned from sequencer';
    END IF;

END;
$function$

trigger_no_manual_keys BEFORE INSERT ON vendor FOR EACH ROW EXECUTE PROCEDURE tf_no_manual_keys()

但是,这不起作用,因为音序器已经触发(我认为 "BEFORE" 触发器不是这种情况)。

我想我总是可以在 BEFORE INSERT 上调用触发器,但这似乎每次调用它都会使用 2 个 ID。

我正在使用 PostgreSQL 9.4

如果您在特定列上具有 grant privilege on the table you can revoke 角色的 insert 权限:

revoke insert (id) on table t from role_name;

但如果该角色是具有该特权的另一个角色的成员,那将不起作用。