Usuário com melhor resposta
Manipular registros do Postgre via SQLSERVER 2005 via Linked Server

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
Respostas
-
Adriano,
É possível sim, veja alguns exemplos:
Code SnippetDeclare @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
GoInsert 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.produtosSet
Marca='Sanro Top 'Where
Codigo=211 -
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 SnippetWITH
Qry AS(
select * from openquery(PostgreSQL, 'select * from tabela'))UPDATE
QrySET
<Especificacoes de Update>Ou
DECLARE
@cmdSQL VARCHAR(1000)SET
@cmdSQL = 'SeuComando de Update'EXEC
(@cmdSQL) AT [PostgreSQL][ ]s,
Gustavo
Todas as Respostas
-
Adriano,
É possível sim, veja alguns exemplos:
Code SnippetDeclare @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
GoInsert 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.produtosSet
Marca='Sanro Top 'Where
Codigo=211 -
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.transitionretorna 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,
-
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 SnippetWITH
Qry AS(
select * from openquery(PostgreSQL, 'select * from tabela'))UPDATE
QrySET
<Especificacoes de Update>Ou
DECLARE
@cmdSQL VARCHAR(1000)SET
@cmdSQL = 'SeuComando de Update'EXEC
(@cmdSQL) AT [PostgreSQL][ ]s,
Gustavo
-
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.