Ir ao conteúdo
  • Cadastre-se

Triger de tabela muitos para muitos na inserção


JorgeReidinaldo

Posts recomendados

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;




Link para o comentário
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 ^^

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...

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.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...