2017-05-03 30 views
1

我必须在postgres中编写触发器 触发器应该在rp_resourceUser表中插入值。postgres触发器在条件时插入值

我有三个表rp_user,rp_resourceUser,rp_resourceType他们都在public模式

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; 

我从来没有写过触发器之前,所以我不知道如果这就是正确的..所以需要建议

+0

这里有一个教程:http://www.postgresqltutorial.com/introduction-postgresql-trigger/这有帮助吗? –

回答

0

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(); 
  • 如果要插入多个表的数据集,使用加入:
  • 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; 
    
  • 从你的结构我没有看到你填充rp_resource_type(无论你如何引用它),这使我怀疑,需要行,并与新加入的将缺席任何明显的方法,使新行将不会被插入到rp_user表过...
  • 我建议你先用手工操作在所有三个表中的数据,写下来的操作和要求的顺序播放,首先改善的模式(尤其是与FK和序列),然后回到创建触发器。

    +0

    hi @Vao .. rp_resourceUserType表中有一些值..所以我想它应该从那里开始序列默认..我加入他们与外键我已更新值在上面的问题 – Pritbh

    +0

    每个数据表中请把**更新**也 - 否则我的回答过时 –