Trigger no Postgresql

Tenho uma tabela de empregados no postgresql com algumas informaçoes de empregados. Preciso fazer uma TRIGGER para quando DELETAR um empregado, NAO DELETAR quem é MANAGER e quem é UNICO empregado de um MANAGER.

Um MANAGER tem seu empno referenciado no campo mgr da tabela emp.
Entao, como fazer esta trigger? Fiz uma versao mas nao esta funcionando

[code]CREATE TABLE emp
(
empno int4 NOT NULL,
ename varchar(30) NOT NULL,
job varchar(30) NOT NULL,
deptno int4 NOT NULL,
mgr int4,
);

ALTER TABLE emp
ADD CONSTRAINT “PKemp” PRIMARY KEY(empno);[/code]


empno | ename | job | deptno | mgr |
-------±--------±----------±-------±-----+
7839 | KING | P | 10 | |
7698 | BLAKE | M | 30 | 7839 |
7900 | JAMES | CL | 30 | 7698 |
7990 | JOHNSON | S | 30 | 7698 |
7654 | MARTIN | S | 30 | 7698 |
7844 | TURNER | S | 30 | 7900 |


obrigada, Veronica

você usa o hibernate?

caso sim, tem uma anotação chamada audit se não me engano, ela faz todo esse trabalho para você.

POxa nao trabalho com Hibernate nao…

Tem uma dica para como fazer essa trigger?

Obrigada

Eu não consegui entender direito o que você precisa.

Pelo que vi nessa tabela emp, o mgr aponta um outro empno , que é o gerente daquele funcionário.

  • Quando você tenta apagar um funcionário que não é gerente, o que deve acontecer?

  • Quando você tenta apagar um gerente, o que deve acontecer?

OLa e obrigada por ajudar,

Quando você tenta apagar um funcionário que não é gerente e que nao é o UNICO funcionario de um gerente PODE APAGAR.

Quando você tenta apagar um gerente, aparece uma mensagem dizendo ser impossivel APAGAR

Quando tentar apagar funcionario unico de um gerente, aparece uma mensagem dizendo ser impossivel APAGAR…

Se quiser me add no skype veronica_medeiros

OBRIGADA

Acho que entendi. Imagino que deva acrescentar essas condições na sua trigger:


  SELECT count(*) FROM emp INTO meus_subordinados WHERE mgr = OLD.empno;

  SELECT count(*) FROM emp INTO subordinados_meu_gerente WHERE mgr = OLD.mgr;


  IF meus_subordinados > 0 OR subordinados_meu_gerente = 1 THEN
    RAISE NOTICE 'sua mensagem'
  END IF

Não conheço bem a sintaxe de plpgsql, mas imagino que a idéia seja essa.

Obrigada, vou testar isso aqui agora no meu banco de dados e jah volto para dizer se funcionou…

OBRIGADA

OLa…

A funçao funcionou bem legal, OBRIGADA…
Mas ainda nao estou conseguindo DELETAR um registro.

Devo colocar uma clausula DELETE dentro da funçao para deletar o registro, correto?

Obrigada,
Veronica

[quote=veronicaveronica]Devo colocar uma clausula DELETE dentro da funçao para deletar o registro, correto?
[/quote]

Não, não precisa.

A trigger só é executada quando você executar uma operação de Delete.

Se você quiser apagar, basta não fazer nada.

Para impedir que o registro seja apagado, aí sim você tem que gerar o erro para impedir.

ahhhh, entendi, obrigada…