AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 279226
Accepted
Shekar Kola
Shekar Kola
Asked: 2020-11-06 00:34:22 +0800 CST2020-11-06 00:34:22 +0800 CST 2020-11-06 00:34:22 +0800 CST

Provedor OLE DB "MSOLEDBSQL" com SQL Server não suportado?

  • 772

Tenho usado o servidor vinculado com o provedor antigo (SQLNCLI) sem nenhum problema, conforme recomendado pela Microsoft , estou planejando mudar para o novo provedor (MSOLEDBSQL). Consigo adicionar servidor vinculado usando o seguinte T-SQL depois de instalar os drivers

EXEC sp_addlinkedserver     
   @server=N'SQL02\DEV1',   
   @srvproduct=N'',  
   @provider=N'MSOLEDBSQL',   
   @datasrc=N'SQL02,1933';  

Infelizmente, recebendo o seguinte erro quando tento consultar um novo servidor vinculado:

Consultas que tentei:

--- example 1
select * from OPENQUERY ([SQL02\DEV1], 'select name from sys.databases');

--- example 2
select name from [SQL02\DEV1].master.sys.databases;


--- example 3 (without linked server dependency)
SELECT c.* FROM OPENROWSET(
      'MSOLEDBSQL'
    , 'Server=SQL02,1933;Database=master;Integrated Security=True;'
    , 'SELECT name FROM sys.databases;'
    ) c;

Obtendo o mesmo erro de todos os exemplos:

O uso fora de processo do provedor OLE DB "MSOLEDBSQL" com SQL Server não é suportado.

Isso realmente significa que o SQL-2016 não é compatível com o uso do novo provedor MSOLEDBSQL, especialmente em servidores vinculados, ou há algo que eu perdi além de reinstalar drivers e reiniciar o SQL Server.

sql-server sql-server-2016
  • 2 2 respostas
  • 10764 Views

2 respostas

  • Voted
  1. Best Answer
    John K. N.
    2020-11-06T05:12:09+08:002020-11-06T05:12:09+08:00

    Parece que você fez tudo certo. No entanto, o link que você postou tem um comentário na página que afirma:

    Esta página não é mais mantida. Por favor, leia os detalhes abaixo.

    Se você abrir a guia de detalhes clicando no sinal + , você será recebido com as seguintes informações:

    Esta página não é mais mantida. Para baixar o Microsoft OLE DB Driver 18 for SQL Server, acesse a página de documentação em https://aka.ms/downloadmsoledbsql .

    Isso levará você para https://learn.microsoft.com/en-gb/sql/connect/oledb/download-oledb-driver-for-sql-server?view=sql-server-ver15 (Apenas no caso do curto link torna-se obsoleto.)

    Eu pegaria os drivers OLE DB mais recentes de lá.

    Driver do Microsoft OLE DB para SQL Server

    Tome seu tempo e leia as informações sobre as diferentes gerações de drivers OLE DB na página da web. Na subseção intitulada 3. Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL) há esta pequena nota que afirma:

    O novo provedor OLE DB é chamado de Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL). O novo provedor será atualizado com os recursos mais recentes do servidor daqui para frente.

    Com base no que você escreveu em sua pergunta, você deve estar usando o driver OLE DB correto. Bom....


    Criar servidor vinculado do SQL Server 2019 para o SQL Server 2016

    Eu tenho várias instâncias no meu laptop e criei um servidor vinculado da minha instância de 2019 para uma instância do SQL Server 2016 usando os seguintes procedimentos armazenados:

    USE [master]
    GO
    EXEC master.dbo.sp_addlinkedserver 
        @server = N'MSOLEDBDSQL', 
        @srvproduct=N'SERVER\sql2016', 
        @provider=N'MSOLEDBSQL', 
        @datasrc=N'SERVER\sql2016', 
        @catalog=N'master'
    
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'collation compatible', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'data access', @optvalue=N'true'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'dist', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'pub', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'rpc', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'rpc out', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'sub', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'connect timeout', @optvalue=N'0'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'collation name', @optvalue=null
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'lazy schema validation', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'query timeout', @optvalue=N'0'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'use remote collation', @optvalue=N'true'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'remote proc transaction promotion', @optvalue=N'true'
    GO
    USE [master]
    GO
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'MSOLEDBDSQL', @locallogin = NULL , @useself = N'True'
    GO
    

    Em seguida, consultei o servidor vinculado com a seguinte declaração:

    SELECT name, create_date FROM MSOLEDBDSQL.master.sys.databases 
    

    Que prontamente retornou:

    +----------------------+-------------------------+
    |         name         |       create_date       |
    +----------------------+-------------------------+
    | master               | 2003-04-08 09:13:36.390 |
    | tempdb               | 2020-11-03 16:29:26.787 |
    | model                | 2003-04-08 09:13:36.390 |
    | msdb                 | 2016-04-30 00:46:38.773 |
    | SSODB                | 2020-01-03 14:35:34.143 |
    | BizTalkMgmtDb        | 2020-01-03 14:35:39.570 |
    | BizTalkDTADb         | 2020-01-03 14:35:43.370 |
    | BizTalkMsgBoxDb      | 2020-01-03 14:35:45.137 |
    | BizTalkRuleEngineDb  | 2020-01-03 14:36:21.603 |
    | BAMPrimaryImport     | 2020-01-03 14:36:34.713 |
    | BAMArchive           | 2020-01-03 14:36:35.333 |
    | DemoDB               | 2020-01-15 12:04:41.427 |
    | BAMAlertsApplication | 2020-01-28 14:40:20.767 |
    +----------------------+-------------------------+
    

    Parece funcionar bem.

    Criar servidor vinculado da instância do SQL Server 2016 (CI) para a instância do SQL Server 2016

    Em seguida, criei um servidor vinculado da minha instância de 2016 que não diferencia maiúsculas de minúsculas para a mesma instância do SQL Server 2016 usando os seguintes procedimentos armazenados:

    USE [master]
    GO
    EXEC master.dbo.sp_addlinkedserver 
        @server = N'MSOLEDBDSQL', 
        @srvproduct=N'SERVER\sql2016', 
        @provider=N'MSOLEDBSQL', 
        @datasrc=N'SERVER\sql2016', 
        @catalog=N'master'
    
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'collation compatible', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'data access', @optvalue=N'true'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'dist', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'pub', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'rpc', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'rpc out', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'sub', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'connect timeout', @optvalue=N'0'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'collation name', @optvalue=null
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'lazy schema validation', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'query timeout', @optvalue=N'0'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'use remote collation', @optvalue=N'true'
    GO
    EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'remote proc transaction promotion', @optvalue=N'true'
    GO
    USE [master]
    GO
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'MSOLEDBDSQL', @locallogin = NULL , @useself = N'True'
    GO
    

    Em seguida, consultei o servidor vinculado em minha instância de CI com a seguinte declaração:

    SELECT name, create_date FROM MSOLEDBDSQL.master.sys.databases 
    

    Que prontamente retornou:

    Msg 7430, Level 16, State 3, Line 1
    Out-of-process use of OLE DB provider "MSOLEDBSQL" with SQL Server is not supported.
    
    Completion time: 2020-11-05T13:41:43.0333451+01:00
    

    Isso parece se correlacionar com o que você está observando... Hmmm. Vamos pensar sobre isso.

    Causas Possíveis

    • O agrupamento tem que ser o mesmo: CI ou CS
    • Os drivers não são totalmente compatíveis com 2016 ao se conectar de uma instância de 2016 a uma instância de 2016.
    • Algo está diferente na instância do SQL Server 2019 em comparação com a instância do SQL Server 2016.

    Vamos dar uma olhada no...

    Explorador de Ojbect | Objetos de servidor | Servidores Vinculados | Provedores | Propriedades MSOLEDBSQL

    Abriremos as propriedades do driver na instância do SQL Server 2019 que usei primeiro:

    Driver do Microsoft OLE DB para propriedades do SQL Server na instância de 2019

    ...e as propriedades do driver no SQL Server 2016 CI que usei no meu segundo teste:

    Driver do Microsoft OLE DB para propriedades do SQL Server na instância de CI de 2016

    E aí temos que. A propriedade Permitir inprocesso na instância configurada do SQL Server 2016 CI não está marcada. A instância do SQL Server 2019 tem essa configuração marcada. Vamos alterá-lo para nossa instância do SQL Server 2016 e executar a consulta. Funciona!

    Solução

    Certifique-se de que a opção Permitir inprocess esteja marcada para o Microsoft OLE DB Driver for SQL Server em suas propriedades no Linked Server | Provedores .

    • 12
  2. AMtwo
    2020-11-06T04:00:39+08:002020-11-06T04:00:39+08:00

    O OLE DB foi  descontinuado  e lançado em 2018 como MSOLEDBSQL. As versões anteriores (e ainda obsoletas) são SQLOLEDB ou SQLNCLI.

    Como você está usando o SQL Server 2016, seu servidor provavelmente não possui o MSOLEDBSQL instalado. Você terá que instalá-lo no servidor antes de poder usá-lo em um servidor vinculado.

    Mais informações, incluindo um link para download, estão disponíveis nos documentos .

    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve