Database postgres触发器在条件为时插入值

Database postgres触发器在条件为时插入值,database,postgresql,triggers,postgresql-9.1,Database,Postgresql,Triggers,Postgresql 9.1,我必须在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

我必须在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_资源_用户_类型中的插入值时

我写过这样的东西

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;
我以前从未写过触发器,所以我甚至不知道这是否正确。。所以需要建议

  • 您需要资源\用户\类型\ id上的序列和其中的默认值,才能使其正常工作。rp\u user没有这样的字段resource\u user\u type\u id,因此
    新建。resource\u user\u type\u id
    将不起作用
  • 您在表而不是列上设置触发器:
  • 如果要插入多个表中的数据集,请使用join:
  • 从您的结构中,我看不到任何明显的填充
    rp\u资源类型的方式(也看不到您如何引用它),这使我怀疑是否缺少用于连接NEW的所需行,因此新行永远不会插入
    rp\u user
    表中

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

    这里有一个教程:这有用吗?hi@Vao。。rp_resourceUserType表中有一些值。。所以我认为默认情况下它应该从这里开始。。我用外键连接它们,我在上面的问题中更新了每个数据表中的值,请把更新也放进去,否则我的答案就过时了
    CREATE TRIGGER gtlPermission AFTER UPDATE ON rp_user
    FOR EACH ROW 
    WHEN (public.rp_user.is_gtl IS true)
    EXECUTE PROCEDURE setGtlPermission();
    
    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;