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