Триггер при ОБНОВЛЕНИИ для УДАЛЕНИЯ строк в другой таблице в зависимости от третьей таблицы

Я пытаюсь создать триггер для следующих таблиц:

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 извлекается из таблицы 'second'.

Вот что я пробовал:

Функция триггера:

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';  

Курок:

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

person user7054784    schedule 23.10.2016    source источник
comment
Так у тебя есть ответ?   -  person Erwin Brandstetter    schedule 29.10.2016


Ответы (1)


Используйте предложение USING из DELETE, чтобы присоединиться к другой таблице:

Функция триггера:

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

Курок:

CREATE TRIGGER test_trigger  
AFTER UPDATE ON first
FOR EACH ROW EXECUTE PROCEDURE pos_org_rel_refresh();
person Erwin Brandstetter    schedule 24.10.2016