我有一个表,其中有一列定义为 id serial
。因此,它在列上默认调用一个排序器。这就是我想要的。然而,我的老板(也是公司的老板)坚持拥有对数据库的完全访问权限,并且喜欢在这个表上编写自己的查询(包括插入)。更不幸的是,他似乎总是忘记应该为他自动生成这些 ID,并且他使用 max(id) + 1 创建记录。然后排序器与表不同步,下次有人调用我们得到 500 分的 API。
问题:鉴于我没有能力将他锁定在数据库之外,防止他这样做的最佳方法是什么?
我的第一个想法是创建一个插入前触发器,并在分配了 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 INSERT 上调用触发器,但这似乎每次调用它都会使用 2 个 ID。
我正在使用 PostgreSQL 9.4
最佳答案
如果你有grant
您可以在表上享有特权 revoke
角色对特定列的 insert
权限:
revoke insert (id) on table t from role_name;
但如果该角色是具有该特权的另一个角色的成员,那将不起作用。
关于postgresql - 当列有默认值时防止查询分配 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33924820/