none
Manipular registros do Postgre via SQLSERVER 2005 via Linked Server RRS feed

  • Pergunta

  •  

    Prezados,

     

    Crieu um ponte(LinkedServer) com o banco Postgre e  consigo acessar suas tabelas sem problemas através do SQLSERVER 2005.

    Porém, gostaria de saber se tem como eu manipular essas tabelas via LinkedServer.

     

    O Comando para pesquisa é algo do tipo:

     

    select * from openquery(PostgreSQL, 'select * from tabela')

     

    Gostaria de usar comandos UPDATE,DELETE e INSERT via sqlserver.

     

    Usando esse comando no lugar do comando 'select * from tabela' retorna o erro abaixo.

     

    Cannot process the object "delete from tabela ". The OLE DB provider "MSDASQL" for linked server "PostgreSQL" indicates that either the object has no columns or the current user does not have permissions on that object.

     

    Alguem tem alguma dica?

     

    Atc,

    Adriano O Moreira

    sexta-feira, 25 de abril de 2008 17:30

Respostas

  • Adriano,

     

    É possível sim, veja alguns exemplos:

     

    Code Snippet

    Declare @LoteProducao Char(6),
            @CodProduto Char(3)

    Set @LoteProducao='245061'
    Set @CodProduto='441'

     

    Delete from Ctluvas2006

    Where LoteProducao=@LoteProducao
    AND    SUBSTRING(CONVERT(CHAR(7),CODPRODUTO),1,3)=@CodProduto
    Go

     

    Insert Into CtLuvas2006
    Select * from openquery([131.107.3.2], 'Select * from Ctluvas Where LoteProducao= ''245061'' AND SUBSTRING(CONVERT(CHAR(7),CODPRODUTO),1,3)=''441''')

     

    ou

     

    Insert Into Servidor.Banco.dbo.Suatabela

     Select * from SuaTable

     

    ou

     

    Update [131.107.3.2].laboratorio.dbo.produtos

    Set Marca='Sanro Top '

    Where Codigo=211

     

     

     

     

     

    sexta-feira, 25 de abril de 2008 17:39
  • Olá Adriano,

     

    O melhor seria você criar uma view e submeter o comando de update contra essa view. Dessa forma qualquer mudança basta que você altere o código da View. Isso é particularmente útil se você precisar referenciar esse linked server em vários pontos do seu aplicativo.

     

    Pensando "SQL Server 2000" você pode referenciar a nomeclatura completa (FQDN) de sua tabela no Postgree. Ex:

     

    UPDATE PostgreSQL.dbapi.publicX.transition SET

     

    No entanto me parece que por uma limitação de driver você não conseguiu fazê-lo. Fica então a sugestão da View.

     

    Se formos pensar no modo "SQL Server 2005" existem outras alternativas. Tente os comandos abaixo:

     

    Code Snippet

    WITH Qry AS

    (select * from openquery(PostgreSQL, 'select * from tabela'))

    UPDATE Qry

    SET <Especificacoes de Update>

     

    Ou

     

    DECLARE @cmdSQL VARCHAR(1000)

    SET @cmdSQL = 'SeuComando de Update'

    EXEC (@cmdSQL) AT [PostgreSQL]

     

     

    [ ]s,

     

    Gustavo

    sábado, 26 de abril de 2008 18:52

Todas as Respostas

  • Adriano,

     

    É possível sim, veja alguns exemplos:

     

    Code Snippet

    Declare @LoteProducao Char(6),
            @CodProduto Char(3)

    Set @LoteProducao='245061'
    Set @CodProduto='441'

     

    Delete from Ctluvas2006

    Where LoteProducao=@LoteProducao
    AND    SUBSTRING(CONVERT(CHAR(7),CODPRODUTO),1,3)=@CodProduto
    Go

     

    Insert Into CtLuvas2006
    Select * from openquery([131.107.3.2], 'Select * from Ctluvas Where LoteProducao= ''245061'' AND SUBSTRING(CONVERT(CHAR(7),CODPRODUTO),1,3)=''441''')

     

    ou

     

    Insert Into Servidor.Banco.dbo.Suatabela

     Select * from SuaTable

     

    ou

     

    Update [131.107.3.2].laboratorio.dbo.produtos

    Set Marca='Sanro Top '

    Where Codigo=211

     

     

     

     

     

    sexta-feira, 25 de abril de 2008 17:39
  •  

    Galvão,

     

    Tentei algo dese tipo sem sucesso:

     

    O exemplo abaixo retornar valores:

    select * from openquery(PostgreSQL, 'select * from bdapi.public.transition ');

     

    Porém, a instrução

    select * from PostgreSQL.bdapi.public.transition

    retorna o erro:

     

    Msg 156, Level 15, State 1, Line 1

    Incorrect syntax near the keyword 'public'.

     

    Colocando outro schema(Inexistente) como:

     

    select * from PostgreSQL.bdapi.publicX.transition

     

    retorna o erro:

     

    Invalid use of schema or catalog for OLE DB provider "MSDASQL" for linked server "PostgreSQL". A four-part name was supplied, but the provider does not expose the necessary interfaces to use a catalog or schema.

     

    Mais alguma sugestão?

     

     

    Atc,

    sexta-feira, 25 de abril de 2008 18:03
  • Olá Adriano,

     

    O melhor seria você criar uma view e submeter o comando de update contra essa view. Dessa forma qualquer mudança basta que você altere o código da View. Isso é particularmente útil se você precisar referenciar esse linked server em vários pontos do seu aplicativo.

     

    Pensando "SQL Server 2000" você pode referenciar a nomeclatura completa (FQDN) de sua tabela no Postgree. Ex:

     

    UPDATE PostgreSQL.dbapi.publicX.transition SET

     

    No entanto me parece que por uma limitação de driver você não conseguiu fazê-lo. Fica então a sugestão da View.

     

    Se formos pensar no modo "SQL Server 2005" existem outras alternativas. Tente os comandos abaixo:

     

    Code Snippet

    WITH Qry AS

    (select * from openquery(PostgreSQL, 'select * from tabela'))

    UPDATE Qry

    SET <Especificacoes de Update>

     

    Ou

     

    DECLARE @cmdSQL VARCHAR(1000)

    SET @cmdSQL = 'SeuComando de Update'

    EXEC (@cmdSQL) AT [PostgreSQL]

     

     

    [ ]s,

     

    Gustavo

    sábado, 26 de abril de 2008 18:52
  • Gustavo,

    Através do comando

    DECLARE @cmdSQL VARCHAR(1000)

    SET @cmdSQL = 'SeuComando de Update'

    EXEC (@cmdSQL) AT [PostgreSQL]

     

    eu conseguir manipular os registros corretamente.

     

    Lembrando que é necesário habilitar o  RPC Out do Linked Server.

     

    Muito obrigado.

     

     

    segunda-feira, 28 de abril de 2008 16:57