Adriano,

Não sei se entendi direito tua duvida, mas vamos lá.

Teoricamente as duas tabelas deveriam ter chaves estrangeiras obrigatorias e
cruzadas. 

Ex:

Tb_pessoa
Id not null
Nome not null
Id_familia (fk) not null

Tb_familia
Id not null
Nome not null
Id_responsavel (fk) not null


Mas com isso, voce sempre terá erro de referencia não encontrada e não vai
conseguir inserir nada, pois para inserir a primeira pessoa, é necessário
uma família, e para inserir a primeira família é necessário uma pessoa.

Então sugiro que voce tire o "not null" do campo id_responsável e, no
momento da inserção em tb_pessoa, verifique se a família selecionada possui
responsável. Se não existir, defina o id (pessoa) atual como responsável.


Com isso, as tabelas ficariam assim:

Tb_pessoa
Id not null
Nome not null
Id_familia (fk) not null

Tb_familia
Id not null
Nome not null
Id_responsavel (fk) null

Create trigger tr_ins_familia after insert on tb_familia
For each row
Begin
  Update tb_familia set id_responsavel=:new.id where id=:new.id_familia and
id_responsavel is null;
End;


E em um trigger de update, não permita que o usuário deixe o campo
id_responsável nulo...


-----Mensagem original-----
De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em
nome de adrianogalhardof
Enviada em: terça-feira, 14 de fevereiro de 2006 14:26
Para: oracle_br@yahoogrupos.com.br
Assunto: [oracle_br] Re: Trigger, Function ou Procedure? O que usar no meu
caso?

chiappa

Eu tenho uma familia que possui pessoas. Nesta familia apenas uma
pessoa pode ser o responsavel legal. Ou seja. Se alguem tentar incluir
mais uma pessoa como responsavel para essa familia o banco deve gerar
um exception. Outra regra é a seguinte. Na primeira inclusão de uma
pessoa na familia, deve-se verificar tamb que essa pessoa seja
obrigatoriamente um responsavel legal. O campo responsavel legal é
obrigatório na primeira inclusão.

Eu estou criando agora um trigger...falta criar as codições de update
e insert...mas acho q vai resolver meu problema. 
Obs.: Salvinho obrigado pelos exemplos. foi de grande utilidade.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

CREATE OR REPLACE
TRIGGER TR_RESPONSAVEL_LEGAL BEFORE INSERT OR UPDATE ON DGPUSER.PESSOA
FOR EACH ROW
DECLARE 
openMode NUMBER(5);
w_error EXCEPTION;

BEGIN
  SELECT COUNT(RESPONSAVEL_LEGAL) INTO openMode FROM DGPUSER.PESSOA p
WHERE p.familia_id = :new.familia_id;
    
--Insert
--TO DO
if(openMode>0) THEN
      RAISE w_error;
    end if;
--Update
--TO DO

  EXCEPTION
  WHEN w_error THEN
  RAISE_APPLICATION_ERROR (-2001, 'Responsavel já exite');  
END;


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


--- Em oracle_br@yahoogrupos.com.br, "jlchiappa" <[EMAIL PROTECTED]> escreveu
>
> Colega, se eu entendi direito vc quer que SE o responsável está 
> cadastrado, ok, é válido, SE não está cadastrado a inserção dessa 
> família com esse responsável não-cadastrado seja inválida, é isso ?? 
> SE for isso, nada mais é do que uma CONSTRAINT FK, assim :
> 
> [EMAIL PROTECTED]:SQL>create table PESSOA (cod_pessoa number, nome_pessoa 
> varchar2(80));
> 
> Tabela criada.
> 
> [EMAIL PROTECTED]:SQL>alter table PESSOA add constraint PK_PESSOA primary 
> key (COD_PESSOA);
> 
> Tabela alterada.
> 
> [EMAIL PROTECTED]:SQL>create table FAMILIA(cod_familia number, 
> descr_familia varchar2(80), cod_responsavel number);
> 
> Tabela criada.
> 
> 
> [EMAIL PROTECTED]:SQL>alter table FAMILIA add constraint FK_RESPONSAVEL 
> foreign key (COD_RESPONSAVEL) references PESSOA(cod_pessoa);
> 
> Tabela alterada.
> 
> 
> [EMAIL PROTECTED]:SQL>insert into PESSOA values(1, 'ABC');
> 
> 1 linha criada.
> 
> 
> ==> OK, vamos inserir as famílias. Primeiro vou inserir uma família 
> com um responsável (1) que existe :
> 
> [EMAIL PROTECTED]:SQL>insert into FAMILIA values(01, 'familia 1', 1);
> 
> 1 linha criada.
> 
> ==> perfeito, agora vou tentar com um cara (responspavel 2) que NÂO 
> foi cadastrado:
> 
> [EMAIL PROTECTED]:SQL>insert into FAMILIA values(02, 'familia 2', 2);
> insert into FAMILIA values(02, 'familia 2', 2)
> *
> ERRO na linha 1:
> ORA-02291: restrição de integridade (SCOTT.FK_RESPONSAVEL) violada - 
> chave mãe não localizada
> 
> 
> [EMAIL PROTECTED]:SQL>
> 
> 
> ==> SE não for isso, dá um exemplo melhor do que vc quer.
> 
> []s
> 
>  Chiappa
>  
> --- Em oracle_br@yahoogrupos.com.br, "adrianogalhardof" 
> <[EMAIL PROTECTED]> escreveu
> >
> > Pessoa,
> > 
> > Estou tendo um problema. Tenho 2 tabelas(pessoa e familia). Cada
> > familia possui um responsavel legal que é uma pessoa. Como posso 
> fazer
> > uma verificação na inserção de uma pessoa checando se a familia que
> > ela está sendo inserida já possui responsavel legal?
> > 
> > uma trigger resolve meu problema?
> > 
> > obrigado
> > Adriano
> >
>






----------------------------------------------------------------------------
----------------------------------------------
Atenção! As mensagens deste grupo são de acesso público e de inteira
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
----------------------------------------------------------------------------
----------------------------------------------______________________________
____________________________________
Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 

 
Links do Yahoo! Grupos




 





--------------------------------------------------------------------------------------------------------------------------
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--------------------------------------------------------------------------------------------------------------------------__________________________________________________________________
Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 

 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 


Reply via email to