Ir ao conteúdo
  • Cadastre-se
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

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

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





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

×