2013/7/17 Deliane Andrade <[email protected]>
> Bom dia a todos!
> Tenho a seguinte trigger para atualizar dados de uma base1 em outra base2:
>
> *- TRIGGER :*
>
> CREATE OR REPLACE FUNCTION sia.func_trg_atualiza_sia_unidade_ensino_dblink
> (
> )
> RETURNS trigger AS
> $body$
> BEGIN
> -- Escolha da opção INSERT no banco siig_teste cujo IP é = 192.168.200.41
>
> IF (TG_OP = 'INSERT')
> THEN
> SELECT dblink_exec
> ('dbname= siig_teste
> host = meu ip
> user = postgres
> password = minha senha
> port=5432',
>
> (codigo,codigo_sia_depd_adm,cod_entd_prpr_sia_depd_adm,cod_bairro_pap_unid_geografica,cod_mun_pap_unid_geografica,
>
>
> codigo_ace_estrut_orgn,codigo_escola,sequencial_anexo,codigo_secretaria,nome
> ,nome_abreviado,cgc,
>
> codigo_sia_sit_functo,codigo_sia_polo_ue,codigo_abp_imovel,logradouro,numero,complemento,codigo_pap_uf,
>
>
> cep,fone,fax,ramal,codigo_sia_localizacao,codigo_sia_delm_terreno,codigo_sia_topografia_terreno,
>
>
> codigo_sia_docm_terreno,codigo_sia_natr_ocupc_predio,area_total,area_construida,area_util,origem_construcao,
>
>
> ano_construcao,dificil_acesso,motivo_dificil_acesso,nte_bahia,cepes_paraiba,perc_dist_corrente,perc_dist_capital,
>
> perc_dist_terceiros,ind_inad
> ,particular_filantropica,setor,paisetor,codigo_pessoa_diretor,codigo_sia_ue_origem_diretor,
>
>
> nome_abreviado_fonetizar,escola_municipalizada,codigo_municipio,email,cd_escola,bairro,sequencial_anexo_mec,
>
>
> sequencial_anexo_setor,dt_criacao,ano_letivo_funcionamento,diario_oficial_estado,observacao,distrito,escola_sede_municipio,
>
> escola_jovem_futuro,ano_extincao)
> VALUES
> (
> new.codigo,new.codigo_sia_depd_adm,new.cod_entd_prpr_sia_depd_adm,new.cod_bairro_pap_unid_geografica,new.cod_mun_pap_unid_geografica,
>
> new.codigo_ace_estrut_orgn,new.codigo_escola,new.sequencial_anexo,new.codigo_secretaria,new.nome
> ,new.nome_abreviado,new.cgc,
>
> new.codigo_sia_sit_functo,new.codigo_sia_polo_ue,new.codigo_abp_imovel,new.logradouro,new.numero,new.complemento,new.codigo_pap_uf,
>
> new.cep,new.fone,new.fax,new.ramal,new.codigo_sia_localizacao,new.codigo_sia_delm_terreno,new.codigo_sia_topografia_terreno,
>
> new.codigo_sia_docm_terreno,new.codigo_sia_natr_ocupc_predio,new.area_total,new.area_construida,new.area_util,new.origem_construcao,
>
> new.ano_construcao,new.dificil_acesso,new.motivo_dificil_acesso,new.nte_bahia,new.cepes_paraiba,new.perc_dist_corrente,
> new.perc_dist_capital,new.perc_dist_terceiros,new.ind_inad
> ,new.particular_filantropica,new.setor,new.paisetor,new.codigo_pessoa_diretor,
>
> new.codigo_sia_ue_origem_diretor,new.nome_abreviado_fonetizar,new.escola_municipalizada,new.codigo_municipio,new.email,new.cd_escola,
>
> new.bairro,new.sequencial_anexo_mec,new.sequencial_anexo_setor,new.dt_criacao,new.ano_letivo_funcionamento,new.diario_oficial_estado,
>
> new.observacao,new.distrito,new.escola_sede_municipio,new.escola_jovem_futuro,new.ano_extincao'
> );
> RETURN NEW;
> END IF;
> RETURN NEW;
> END;
> $body$
> LANGUAGE 'plpgsql'
> VOLATILE
> CALLED ON NULL INPUT
> SECURITY INVOKER
> COST 100;
>
>
Posso estar lendo errado, mas essa função não parece ser a que está usando
realmente, não é nem sintaticamente válida. A aspa (logo após
new.ano_extincao') não foi aberta. Pelo jeito falta a parte "INSERT INTO "
do comando.
> Quando executo o INSERT na base 1 :
>
> *-- INSERT:*
>
> INSERT INTO sia.sia_unidade_ensino ("codigo","codigo_sia_depd_adm",
> "cod_entd_prpr_sia_depd_adm",
> "cod_bairro_pap_unid_geografica", "cod_mun_pap_unid_geografica",
> "codigo_ace_estrut_orgn", "codigo_escola",
> "sequencial_anexo", "codigo_secretaria", "nome", "nome_abreviado", "cgc",
> "codigo_sia_sit_functo",
> "codigo_sia_polo_ue", "codigo_abp_imovel", "logradouro", "numero",
> "complemento", "codigo_pap_uf", "cep", "fone",
> "fax", "ramal", "codigo_sia_localizacao", "codigo_sia_delm_terreno",
> "codigo_sia_topografia_terreno",
> "codigo_sia_docm_terreno", "codigo_sia_natr_ocupc_predio", "area_total",
> "area_construida", "area_util",
> "origem_construcao", "ano_construcao", "dificil_acesso",
> "motivo_dificil_acesso", "nte_bahia", "cepes_paraiba",
> "perc_dist_corrente", "perc_dist_capital", "perc_dist_terceiros",
> "ind_inad", "particular_filantropica", "setor",
> "paisetor", "codigo_pessoa_diretor", "codigo_sia_ue_origem_diretor",
> "nome_abreviado_fonetizar", "escola_municipalizada",
> "codigo_municipio", "email", "cd_escola", "bairro",
> "sequencial_anexo_mec", "sequencial_anexo_setor", "dt_criacao",
> "ano_letivo_funcionamento", "diario_oficial_estado", "observacao",
> "distrito", "escola_sede_municipio",
> "escola_jovem_futuro", "ano_extincao")
> VALUES (23395, 'E', NULL, '150300700800267',
> '150300700800', 4802, '15144747', '00', '403', 'ESCOLA ESTADUAL DE ENSINO
> FUNDAMENTAL E MEDIO TESTE DBLINK',
> 'EEEFM TESTE DBLINK', NULL, 'ATV', NULL, NULL, 'AV TESTE', '141516', 'CONJ
> TESTE, QD 39 - DIST INDUSTRIAL', NULL, '67040450',
> '(91) 3255-3645', '', '', 'U', NULL, NULL, NULL, NULL, NULL, NULL, NULL,
> NULL, NULL, True, NULL, True, True, NULL,
> NULL, NULL, 0, False, '001920932130001', '001920900000000', 10755607, 0,
> NULL, NULL, 43095, '[email protected]',
> '09120', 'CENTRO', '00', '00', NULL, NULL, NULL, NULL, NULL, NULL, NULL,
> NULL);
>
> *- ERRO:* dá o seguinte erro :
>
>
> ERRO: NEW utilizado em consulta que não é uma regra
> CONTEXT: Error occurred on dblink connection named "unnamed": could not
> execute command.
> comando SQL "SELECT dblink_exec
> ('dbname= siig_teste
> host = meu ip
> user = postgres
> password = minha senha
> port=5432',
>
> 'INSERT INTO sia.sia_unidade_ensino
>
> (codigo,codigo_sia_depd_adm,cod_entd_prpr_sia_depd_adm,cod_bairro_pap_unid_geografica,cod_mun_pap_unid_geografica,
>
>
> codigo_ace_estrut_orgn,codigo_escola,sequencial_anexo,codigo_secretaria,nome
> ,nome_abreviado,cgc,
>
> codigo_sia_sit_functo,codigo_sia_polo_ue,codigo_abp_imovel,logradouro,numero,complemento,codigo_pap_uf,
>
>
> cep,fone,fax,ramal,codigo_sia_localizacao,codigo_sia_delm_terreno,codigo_sia_topografia_terreno,
>
>
> codigo_sia_docm_terreno,codigo_sia_natr_ocupc_predio,area_total,area_construida,area_util,origem_construcao,
>
>
> ano_construcao,dificil_acesso,motivo_dificil_acesso,nte_bahia,cepes_paraiba,perc_dist_corrente,perc_dist_capital,
>
> perc_dist_terceiros,ind_inad
> ,particular_filantropica,setor,paisetor,codigo_pessoa_diretor,codigo_sia_ue_origem_diretor,
>
>
> nome_abreviado_fonetizar,escola_municipalizada,codigo_municipio,email,cd_escola,bairro,sequencial_anexo_mec,
>
>
> sequencial_anexo_setor,dt_criacao,ano_letivo_funcionamento,diario_oficial_estado,observacao,distrito,escola_sede_municipio,
>
> escola_jovem_futuro,ano_extincao)
> VALUES
> (
> new.codigo,new.codigo_sia_depd_adm,new.cod_entd_prpr_sia_depd_adm,new.cod_bairro_pap_unid_geografica,new.cod_mun_pap_unid_geografica,
>
> new.codigo_ace_estrut_orgn,new.codigo_escola,new.sequencial_anexo,new.codigo_secretaria,new.nome
> ,new.nome_abreviado,new.cgc,
>
> new.codigo_sia_sit_functo,new.codigo_sia_polo_ue,new.codigo_abp_imovel,new.logradouro,new.numero,new.complemento,new.codigo_pap_uf,
>
> new.cep,new.fone,new.fax,new.ramal,new.codigo_sia_localizacao,new.codigo_sia_delm_terreno,new.codigo_sia_topografia_terreno,
>
> new.codigo_sia_docm_terreno,new.codigo_sia_natr_ocupc_predio,new.area_total,new.area_construida,new.area_util,new.origem_construcao,
>
> new.ano_construcao,new.dificil_acesso,new.motivo_dificil_acesso,new.nte_bahia,new.cepes_paraiba,new.perc_dist_corrente,
> new.perc_dist_capital,new.perc_dist_terceiros,new.ind_inad
> ,new.particular_filantropica,new.setor,new.paisetor,new.codigo_pessoa_diretor,
>
> new.codigo_sia_ue_origem_diretor,new.nome_abreviado_fonetizar,new.escola_municipalizada,new.codigo_municipio,new.email,new.cd_escola,
>
> new.bairro,new.sequencial_anexo_mec,new.sequencial_anexo_setor,new.dt_criacao,new.ano_letivo_funcionamento,new.diario_oficial_estado,
>
> new.observacao,new.distrito,new.escola_sede_municipio,new.escola_jovem_futuro,new.ano_extincao'
> )"
> PL/pgSQL function sia.func_trg_atualiza_sia_unidade_ensino_dblink() line 7
> at comando SQL
>
> Ainda não consegui visualizar qual é o problema.
>
Pelo jeito você está mandando o "new.<campo>" na query, mas deveria ter
concatenado o valor. Exemplo:
dblink_exec( <conn>, 'INSERT INTO (campo1, campo2, ...) VALUES(' ||
quote_literal(new.campo1) || ',' || quote_literal(new.campo2) ||','|| ... );
Ou tentar usar a dblink_build_sql_insert [1].
[1]
http://www.postgresql.org/docs/current/static/contrib-dblink-build-sql-insert.html
Atenciosamente,
--
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral