相关疑难解决方法(0)

如何防止 PostgreSQL 触发器被另一个触发器触发?

我在一张桌子上有 2 个触发器;一种适用于插入:

CREATE TRIGGER "get_user_name"
AFTER INSERT ON "field_data"
FOR EACH ROW EXECUTE PROCEDURE "add_info"();
Run Code Online (Sandbox Code Playgroud)

这会更新表中的一些值。
还有一个用于更新(填充历史表):

CREATE TRIGGER "set_history"
BEFORE UPDATE ON "field_data"
FOR EACH ROW EXECUTE PROCEDURE "gener_history"();
Run Code Online (Sandbox Code Playgroud)

问题是,当我在表中插入新行时,该过程"add_info"()会进行更新并因此触发第二个触发器,该触发器以错误结束:

ERROR:  record "new" has no field "field1"
Run Code Online (Sandbox Code Playgroud)

我怎样才能避免这种情况?

postgresql trigger plpgsql postgresql-9.3

11
推荐指数
2
解决办法
7709
查看次数

防止显式插入串行列

我想防止显式插入串行列。我想到了以下触发器:

drop table test_table;

create table test_table(
id bigserial primary key,
foobar text
);

create or replace function serial_id_check() returns trigger as
$$
begin
    if new.id != currval(TG_TABLE_NAME||'_id_seq') then
        raise exception 'Explicit insert into serial id, currval = %, tried to insert = %', currval(TG_TABLE_NAME||'_id_seq'), new.id;
    end if;
    return new;
end;
$$ language plpgsql;

create trigger test_table_serial_id_check
before insert on test_table
for each row
execute procedure serial_id_check();
Run Code Online (Sandbox Code Playgroud)

也许有更好的方法?也许这种方法被打破了,这根本无法实现?

PS 我也考虑不授予插入和更新的权限,而只授予 pgplsql 插入/更新程序的权限 - 但这种方法现在对我来说是不可能的。

postgresql trigger database-design permissions sequence

5
推荐指数
2
解决办法
4293
查看次数

删除表中的所有行后,如何将序列类型重置回 0?

我之前问过这个问题,有人在 db fiddle 上发布了一个非常有用的答案。这对我来说非常有效。但是,现在我想问一个新的(相关)问题:

假设我清除了表中的所有行(即在数据库小提琴示例中,通过执行“从 id > 0 的水果中删除”来删除苹果和橙色行)。如果我插入另一种水果(如西瓜),id 将从 4 开始,而不是 1。如何强制 id 类型重置回 0,以便下一次插入的 id=1 ?

postgresql postgresql-10

4
推荐指数
1
解决办法
8380
查看次数