无法让链接服务器在 Sql Azure 中工作

问题描述 投票:0回答:5

我们正在使用 Azure 的试用版。我们正在尝试从我们内部的 SQL Server 2012 执行跨服务器查询。

我们似乎已经将本地的 2012 年与 Azure 联系起来了。当我进入管理工作室中的

Server Object
->
Linked Servers
时,我会看到我们的
Azure
数据库。

但是,如果我尝试打开目录和表格,我会收到一条错误消息:

此版本的 SQL Server 不支持引用“Perseus.sys.sp_tables_rowset2”中的数据库和/或服务器名称

** Perseus 是我们在

Azure Sql
中的目录名称。

从本地连接运行查询:

SELECT *  FROM [azureDBServer].[Perseus].[dbo].[accounts]

测试结果是:

链接服务器“azureDBServer”的 OLE DB 提供程序“SQLNCLI11”返回消息 “未指定的错误”。消息 40515,第 16 级,状态 2,第 1 行 参考数据库和/或 此版本不支持“Perseus.sys.sp_tables_info_90_rowset”中的服务器名称 SQL 服务器。

同样的内部 SQL 2012 Server 能够通过跨服务器查询并通过链接服务器查看其结构来连接到我们的内部 2008。

我从这篇文章中知道Azure 支持链接服务器

所以我不知道出了什么问题。我们的管理员认为我们可能拥有 Web-Sql 帐户而不是业务 SQL 帐户。此 Azure Web 与 Business SQL 过时的堆栈链接意味着 SQL 版本不是问题,但早于 Azure 提供链接服务器的时间。

所以,我想了解是否

a) 我们没有设置正确的东西来提供 SQL 链接?

b) 我们受到审判的限制?

c) 我们是否受到 Web SQL 版本的限制?

d)还有什么吗?

sql-server azure azure-sql-database
5个回答
40
投票

需要执行下面提到的三个存储过程来添加SQL Azure。使用下面这些存储过程我能够查询 SQL azure。

EXEC sp_addlinkedserver
@server='PROD',
@srvproduct='',     
@provider='sqlncli',
@datasrc='azureserver.database.windows.net',
@location='',
@provstr='',
@catalog='database name'


EXEC sp_addlinkedsrvlogin 
@rmtsrvname = 'PROD',
@useself = 'false',
@rmtuser = 'Azure login',
@rmtpassword = 'password'

EXEC sp_serveroption 'PROD', 'rpc out', true

21
投票

从 SQL 管理添加链接服务器时,没有提供设置默认数据库的选项。所以使用如下所示的东西

EXEC sp_addlinkedserver
@server='name for referring locally', -- here you can specify the name of the linked server
@srvproduct='',     
@provider='sqlncli', -- using SQL Server native client
@datasrc='AzureMachineName.database.windows.net',   -- add here your server name
@location='',
@provstr='',
@catalog='yourdatabasename' 

我认为这可行。


1
投票

这对我有用:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'mypassword';
 
CREATE DATABASE SCOPED CREDENTIAL MySecurity 
WITH IDENTITY = 'mylogin',
SECRET = 'mypassword';
CREATE EXTERNAL DATA SOURCE MyDbAccess
WITH (
    TYPE=RDBMS,
    LOCATION='server name',
    DATABASE_NAME='db_name',
    CREDENTIAL= MySecurity);

CREATE EXTERNAL TABLE MyExtTable (
    [Id] [int]  NOT NULL,
    [Name] [varchar(20)] NULL)
WITH
(DATA_SOURCE = MyDbAccess);

之后就可以使用了:

SELECT * FROM MyExtTable

1
投票

看起来您实际上并未建立与 Perseus 数据库的连接。从错误消息来看,您似乎正在向 Azure 发送包含 3 部分或 4 部分名称的查询。这在 Azure 中不起作用。

请检查您的查询并将其设置为使用 2 个部分名称,如果连接到同一数据库则仅使用三个部分名称。


0
投票

我收到此错误,我的问题最终是数据库名称中的一种类型

SERVER.Database.dbo.tableName

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.