Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
JorgeReidinaldo

Triger de tabela muitos para muitos na inserção

Recommended Posts

A ideia principal do meu projeto é tenho uma table que eu cadastro empresa nesta, uma tabela de sócios, e uma terceira que faz a relação entre sócios e a empresa.

No meu evento de inserção verifiquei a necessidade de ter uma triger para fazer está operação.

Minha tabela empresa criei uma sequencia, e é isso que esta pegando, na minha triger para eu concluir o insert , tenho que fazer tudo ao mesmo tempo pegar o numero que acabei de criar na tabela empresa para lançar dentro da tabela tb_emp_socio, não sei como pegar o numero criado na tabela empresa sem que em controle de concorrência outro usuário faça a mesma operação e eu pegue o numero errado




CREATE TABLE "global".tb_empresas
(
pk_empresa smallint NOT NULL DEFAULT nextval('global.seq_empresa'::regclass),
fi_rsocial character varying(100) NOT NULL,
fi_fantasia character varying(100) NOT NULL,
fi_cnpj character varying(17) NOT NULL,
fi_ie character varying(15) NOT NULL,
fi_cga character varying(15) NOT NULL,
fi_data_reg date NOT NULL,
fi_nire character varying(20) NOT NULL,
CONSTRAINT pk_empresa PRIMARY KEY (pk_empresa)
)
WITH (
OIDS=FALSE
);
ALTER TABLE "global".tb_empresas OWNER TO postgres;




CREATE TABLE "global".tb_emp_socio
(
pk_soc_emp smallint NOT NULL,
fk_socio smallint NOT NULL,
fk_empresa smallint NOT NULL,
fi_data date NOT NULL,
fk_tp_socio smallint NOT NULL
)
WITH (
OIDS=FALSE
);
ALTER TABLE "global".tb_emp_socio OWNER TO postgres;




CREATE TABLE "global".tb_socio_fisica
(
pk_socio smallint NOT NULL,
fi_socio character varying(50) NOT NULL,
fi_cpf bigint NOT NULL
)
WITH (
OIDS=FALSE
);
ALTER TABLE "global".tb_socio_fisica OWNER TO postgres;

Tenho esta função que pega o numero do ID da tabela empresa porém na tabela emp_socio preciso de mais informações no insert que são dados digitados

meu problema é garantir que se a inserção forem varias ao mesmo tempo que não tenha como os dados serem salvos errados no BD



CREATE OR REPLACE FUNCTION sc_global.fn_insert_tb_emp_socio()
RETURNS trigger AS
$BODY$begin
begin

insert into sc_global.tb_emp_socio(fk_socio,fk_empresa,fi_data,fk_tp_socio)values(socio,new.pk_empresa,data,tp_socio);

return new;
end;
commit;
end;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION sc_triggers.fn_insert_tb_b() OWNER TO postgres;




Editado por JorgeReidinaldo
Trigger que pega o numero do ID

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, não entendo de postgres, mas veja se não tem nada parecido....

em mysql, você cria a trigger, e define se ela será executada antes ou após a inserção....

o mysql cria como se fosse "duas classes", que você acessa o valor do registro que foi incluso (INSERT) e/ou o valor antigo do campo (no caso de UPDATE) ("classes:" NEW e OLD)

ou seja, após o insert, seria só você pegar o campo, sem fazer consulta nenhuma, acessando essas "classes".

Exemplo pra tentar ser mais claro ^^

CREATE TRIGGER <nome_trigger> AFTER INSERT ON <tabela01> FOR EACH ROW
BEGIN
INSERT INTO <tabela_de_relacionamento> (<codigo>) VALUES ( [b]NEW.[/b]<codigo_da_tabela01> );
END;

ou seja, você fez um INSERT na tabela <tabela01>, inserindo um código no campo <codigo_da_tabela01>

a trigger será executada para inserir um registro na tabela <tabela_de_relacionamento> e no campo <codigo> desta última,

já será definido o valor do campo <tabela01>.<codigo_da_tabela01>

Não sei se postgres tem algo parecido ou se fui claro ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Ainda tenho duvidas quanto ao meu problema, tenho uma tabela onde já tenho cadastrado os socios, na hora em que estou criando a empresa tenho que ter certeza que não a criarei sem socios , na tabela de relacionamento socio empresa tenho que colocar a FK do socio que já posuo, porém o da empresa ainda não tenho, não sei se com triger resolvo ou com uma transação se alguem tiver um exemplo agradeco.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×