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

标签 postgresql postgresql-9.4

我有一个表,其中有一列定义为 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/

相关文章:

postgresql - 将行合并为列

postgresql - 有没有办法删除 libpq(PostgreSQL)中已经准备好的语句?

database - 如何在 postgresql 中循环遍历 string[]?

sql - DECLARE 子句中的 PostgreSQL 函数语法错误

python - sqlalchemy,过滤包含数组的json列

postgresql - PostgreSQL 如何强制执行 UNIQUE 约束/它使用什么类型的索引?

postgresql - 查找最后插入的记录 - Postgresql

django - JSONB PostgreSQL 类型 : how to lookup

sql - 如何选择显示自上次出现特定谓词以来的天数的行?

sql - PostgreSQL 更新不起作用