【问题标题】:postgres trigger to insert value on when conditionpostgres 触发器在何时条件下插入值
【发布时间】:2017-10-01 03:24:55
【问题描述】:

我必须在 postgres 中写一个触发器 触发器应该在 rp_resourceUser 表中插入值。

我有三个表 rp_user、rp_resourceUser、rp_resourceType 它们都在公共模式下

fields in rp_user
user_id bigint NOT NULL,
  is_gtl boolean,
  is_tsc_admin boolean,
  username character varying(255) NOT NULL,
  gtl_user_id bigint,

fields in rp_resource_type

  resource_type_id bigint NOT NULL,
  resource_template text,
  resource_type character varying(255),

fields in rp_resource_user_type

  resource_user_type_id bigint NOT NULL,
  gtl_user_id bigint NOT NULL,
  resource_type_id bigint NOT NULL,
  user_id bigint NOT NULL,

  CONSTRAINT rp_resource_user_type_pkey PRIMARY KEY (resource_user_type_id),
  CONSTRAINT fk6t2cd10tfar76hvvchyo81u66 FOREIGN KEY (user_id)
      REFERENCES public.rp_user (user_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fkb273dt5c7b9s49jlwf1cmbxib FOREIGN KEY (gtl_user_id)
      REFERENCES public.rp_user (user_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fkmbxelxexffw96mcgcu3y25ixl FOREIGN KEY (resource_type_id)
      REFERENCES public.rp_resource_type (resource_type_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT uk994khkskqm5c77mlyipwxu0dv UNIQUE (user_id, gtl_user_id, resource_type_id)

所以触发器的条件是当用户表中的 gtl 标志被设置而不是在 rp_resource_user_type 中插入值时

我写过类似的东西

CREATE TRIGGER gtlPermission AFTER UPDATE ON rp_user.is_gtl
FOR EACH ROW 
WHEN (public.rp_user.is_gtl IS true)
EXECUTE PROCEDURE setGtlPermission();

Create or Replace Function setGtlPsermission () RETURNS TRIGGER AS $rp_resource_user_type$
   BEGIN
      INSERT INTO rp_resource_user_type(resource_user_type_id, gtl_user_id, resource_type_id,user_id)
      VALUES (new.resource_user_type_id,  rp_user.gtl_user_id, rp_resource_type.resource_type_id ,rp_user.user_id);
      RETURN NEW;
   END;
$rp_resource_user_type$ LANGUAGE plpgsql;

我以前从未写过触发器,所以我什至不知道那是否正确..所以需要建议

【问题讨论】:

标签: database postgresql triggers postgresql-9.1


【解决方案1】:

docs

  1. 您需要resource_user_type_id 的序列和其中的默认值才能使其正常工作。 rp_user 没有resource_user_type_id 这个字段,所以new.resource_user_type_id 不起作用...
  2. 您在表而不是列上设置了触发器:
CREATE TRIGGER gtlPermission AFTER UPDATE ON rp_user
FOR EACH ROW 
WHEN (public.rp_user.is_gtl IS true)
EXECUTE PROCEDURE setGtlPermission();
  1. 如果要从多个表中插入数据集,请使用连接:
WITH c as (select * from rp_user join rp_resource_type on some not existing so far key)
INSERT INTO rp_resource_user_type (gtl_user_id, resource_type_id,user_id)
      select gtl_user_id, resource_type_id ,user_id from c where c.user_id = NEW.user_id;
  1. 从您的结构中,我看不到您填充 rp_resource_type 的任何明显方式(无论您如何引用它),这让我怀疑与 NEW 连接所需的行将不存在,因此不会将新行插入到 @ 987654326@ 表永远...

我建议您首先在所有三个表上手动操作数据,写下操作的顺序和要求,首先改进架构(尤其是 FK 和序列),然后再返回创建触发器。

【讨论】:

  • 嗨@Vao .. rp_resourceUserType 表中有一些值.. 所以我想它应该默认从那里开始序列.. 我用外键加入它们我已经更新了每个数据中的值上述问题中的表格
  • 请也放 update - 否则我的答案会过时
猜你喜欢
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
相关资源
最近更新 更多