2016-10-23 1 views
1

Я пытаюсь создать триггер для следующих таблиц:Trigger на UPDATE для удаления строк в другой таблице в зависимости от третьей таблицы

CREATE TABLE public.first (
userid bigint, 
name varchar 
); 

CREATE TABLE public.second (
userid bigint, 
companyid bigint 
); 

CREATE TABLE public.visibility_matrix (
name varchar, 
companyid bigint 
); 

Всякий раз, когда строка в таблице first обновляется, триггер должен принять userid ищите то же самое userid в таблице second. Если это существует, удалите строку/строки из visibility_matrix, где companyid извлекается из таблицы «второй».

Вот что я пробовал: функцию

Trigger:

CREATE OR REPLACE FUNCTION pos_org_rel_refresh() 
    RETURNS trigger AS 
$$ 
DECLARE 
    r Integer ; 

BEGIN 

IF TG_OP='UPDATE' THEN 

DELETE FROM visibility_matrix where companyid=NEW.companyid; 
RETURN NEW; 

    END IF; 
END; 
$$ 
LANGUAGE 'plpgsql'; 

Trigger:

CREATE TRIGGER test_trigger 
AFTER UPDATE 
ON first 
FOR EACH ROW 
EXECUTE PROCEDURE pos_org_rel_refresh(); 
+0

Так что у вас есть ответ? –

ответ

0

трудоустроить USING clause of DELETE присоединиться к другой таблице:

функция

Trigger:

CREATE OR REPLACE FUNCTION pos_org_rel_refresh() 
    RETURNS trigger AS 
$func$ 
-- DECLARE 
-- r int; -- not used in function body 
BEGIN 
-- IF TG_OP='UPDATE' THEN -- redundant while func is only used in AFTER UPDATE trigger 
    DELETE FROM public.visibility_matrix v 
    USING public.second s 
    WHERE s.userid = NEW.userid 
    AND v.companyid = s.companyid; 
-- END IF; 

RETURN NEW; -- and don't place this inside the IF block either way 

END 
$func$ LANGUAGE plpgsql; -- don't quote the language name 

Trigger:

CREATE TRIGGER test_trigger 
AFTER UPDATE ON first 
FOR EACH ROW EXECUTE PROCEDURE pos_org_rel_refresh();