标签: linked-server

本地登录模拟不适用于链接服务器

我使用以下内容在我的服务器上创建了一个链接服务器:

exec sp_addlinkedserver
    @server=N'MyOldDB',
    @srvproduct=N'',
    @provider = N'SQLNCLI',
    @datasrc=N'MYSERVER',
    @catalog=N'TheDefaultDatabase';
Run Code Online (Sandbox Code Playgroud)

现在,尽管以下描述了如何确定登录凭据(来自 MSDN):

本地服务器上的所有登录名和链接服务器上的远程登录名之间的默认映射是通过执行 sp_addlinkedserver 自动创建的。默认映射说明 SQL Server 在代表登录名连接到链接服务器时使用本地登录名的用户凭据。这相当于执行 sp_addlinkedsrvlogin 并将链接服务器的 @useself 设置为 true,而不指定本地用户名。

我收到以下错误:

Msg 18456, Level 14, State 1, Line 1
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时:

select top 10 * from MyOldDB.TheDefaultDatabase.dbo.Batches
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出我正确的方向吗?

sql-server linked-server

7
推荐指数
1
解决办法
3万
查看次数

有没有办法拒绝对来自链接服务器的连接进行 CRUD 操作?

我有一个 SQL Server 实例RPT1(2008 R2),它是为“高级用户”设置的,可以运行他们自己的查询。此服务器链接到我们的生产报告服务器PRD1(SQL Server 2008 实例),具有直接RPT1查询链接服务器 ( PRD1) 的视图 (on ) 。

已使用需要在服务器上进行 CRUD 的帐户创建链接服务器(用于报告审核等)。

随着用户的成熟,他们也会请求更大的权限(例如创建自己的视图)。我想确保他们不会在链接的服务器上执行任何 CRUD 操作,但链接的帐户具有这些权限。

我看到的第一个解析路径是创建一个不同的用户,权限较低,然后重新链接服务器。

我的第二条路径是查看是否有办法DENYPRD1服务器上为来自链接服务器的连接显式CRUD 。

是否可以仅从链接中明确拒绝 CRUD?或者我应该简单地将服务器与不同的帐户重新链接?我忽略了另一个明显的解决方案吗?

sql-server-2008 sql-server permissions sql-server-2008-r2 linked-server

7
推荐指数
1
解决办法
757
查看次数

选择更多的字段会导致灾难性的失败

我有一个从 sql server 2012 到 pervasive sql 的链接服务器的连接。

当我做的select field1, field2, field3 from mytable一切正常!

但是,当我这样做时,select field1, field2, field3, field4, ...field10+ from mytable我收到此错误消息:

Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "MSDASQL" for linked server "KSLAP208" reported an error. The provider reported an unexpected catastrophic failure.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "MSDASQL" for linked server "KSLAP208".
Run Code Online (Sandbox Code Playgroud)

我查看了日志,这是它所说的:

2013-02-08 11:27:30.93 spid55      ***Stack Dump …
Run Code Online (Sandbox Code Playgroud)

sql-server linked-server sql-server-2012

7
推荐指数
1
解决办法
1718
查看次数

对链接服务器的某些查询的通信链接失败

当对链接服务器运行一些查询时,我在 SSMS(服务器安装了 Windows Server 2008 和 Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1)中看到以下错误,特别是长时间运行的查询。

跨链接服务器从表中进行简单选择工作正常。这是一个新问题,当已经工作多年的 SP 开始出现故障时,人们注意到了这个问题。

我在服务器上运行了 Wireshark 捕获,捕获到链接服务器主机上端口 1433 的数据包。在捕获的尾部,我看到许多 (10) 个 TCP Keep-Alives 被发出(在关于错误校验和的消息之后),然后是一个 RST 数据包。RST 数据包与以下返回给客户端的错误相关。

我们网络上还有其他数据库服务器,其中链接服务器的配置相同,不会出现此问题。

我找到了一些文章,例如thisthis。我们正在使用受牵连的 Broadcom NIC。烟囱卸载状态设置在服务器上启用。

我们将尝试禁用。关于故障排除的其他想法将不胜感激。

OLE DB provider "SQLNCLI10" for linked server "myServer" returned message "Protocol error in TDS stream".
OLE DB provider "SQLNCLI10" for linked server "myServer" returned message "Communication link failure".
Msg 65535, Level 16, State 1, Line 0
Session Provider: Physical …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 network linked-server

7
推荐指数
1
解决办法
2万
查看次数

SQL SERVER - 链接服务器和查询性能

我有一个与 SQL Server/链接服务器/视图相关的性能问题。我希望你能帮助我理解什么是做我想做的最好的方法 =)。

  • 我有一个数据库 K,其中包含 3 个链接服务器 L1、L2、L3 到 3 个数据库 X、Y、Z。
  • 在 X、Y、Z 中,我分别有 3 个视图,称为 V1、V2、V3。
  • 我想通过数据库 K 与链接服务器 L1、L2、L3 查询 V1、V2、V3 的并集。

经过一些测试,情况是这样的:

  1. 在 SSMS 中,如果我运行这个伪查询SELECT * FROM (L1.V1 u L2.V2 u L3.V3) WHERE some filters,性能真的很棒
  2. 如果我在数据库 K 中创建一个视图 VK,其中包含三个视图的并集,然后我运行查询,SELECT * FROM VK WHERE some filters则性能比情况 1 差

问题

  • 为什么表现如此不同?
  • 在情况 2 中如何提高性能?

我对提高案例 2 的性能很感兴趣,因为我需要一个视图来在我们的软件中使用 nHbinernate 进行映射......

提前致谢,问候

约翰艾伦的帖子后更新

好的,我尝试但没有结果。我不是 DBA,我在 DB 配置方面的技能非常有限。我们可以一步一步来吗?

  1. 在远程服务器 ( called Y) 上,我called linkedserver …

performance sql-server view linked-server query-performance

7
推荐指数
1
解决办法
3万
查看次数

如何为链接服务器启用分布式事务?

我有一个 SQL Server 2012 实例,其中一个链接服务器使用 System i Access ODBC 驱动程序指向 IBM Iseries 系统上的 db2 数据库。

我正在尝试启用分布式事务。我相信该提供商确实根据IBM 文档支持它们(除非我误解了该链接)。

我正在运行以下查询:

BEGIN TRANSACTION
    UPDATE LINKEDSERVER.LINKEDDATABASE.SCHEMANAME.TABLENAME SET COLUMN = VALUE

    SELECT CAST('qwerty' as integer) -- we want an error here so the transaction fails
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”返回消息“[IBM][System i Access ODBC 驱动程序]登记 DTC 阶段失败。2”。消息 7391,级别 16,状态 2,第 2 行 由于链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”无法开始分布式事务,因此无法执行该操作。

我对这个错误所做的所有研究都遇到过想要禁用分布式事务而不是让它们工作的人。我已经在链接服务器属性上将“启用分布式事务的提升”设置为 true。

任何想法如何让这个工作?

编辑:更多信息/更新。当我在 Windows 日志中注意到这一点时,我正准备暂时放弃这个并等待帮助:

当 XA 事务被禁用时,调用者试图注册一个 XA 资源。

我找到了这个链接,它告诉我如何修改 …

sql-server linked-server sql-server-2012 iseries distributed-transactions

7
推荐指数
2
解决办法
7万
查看次数

如何通过 tcp/ip 为远程数据库指定链接服务器?

我有一个在 IAAS 提供程序上运行的远程数据库,我需要能够从我的本地工作站执行联合查询。我遇到了麻烦,因为当我尝试创建链接时,它试图使用命名管道进行连接。

我使用 SQL Server Native Client 10 创建了一个系统 DSN,并向其提供 IP、数据库、用户和密码。测试了它,它很好。

  1. 转到链接服务器并创建新服务器。
  2. 指定名称“MAIN”
  3. 在组合框中选择 SQL Server Native Client 10
  4. 在产品名称字段中输入 SQL Server
  5. 在数据源字段中输入我的 DSN 名称
  6. 在提供者名称字段中输入 SQLNCLI10
  7. 在目录字段中输入我的数据库名称
  8. 转到安全选项并指定我的本地到远程登录配对。

单击“确定”后,我收到一条错误消息,提示它找不到服务器,并显示它正在尝试使用命名管道。

我应该怎么做才能纠正这个问题?

sql-server sql-server-2008-r2 linked-server

6
推荐指数
1
解决办法
9004
查看次数

链接服务器上缺少数据库

所以有一个链接服务器。但是,在展开目录下拉列表后,我目前无法从 SSMS 中查看与该链接服务器关联的所有数据库。我的理解是这可能是权限问题。但是,我不确定我需要授予哪些权限才能与来自链接服务器的 tat db 进行交互。

有任何想法吗?

从链接服务器执行以下命令后:

select * from [<server>].[<database>].[dbo].table1
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

链接服务器 "" 的 OLE DB 访问接口 "SQLNCLI10" 不包含表 """."dbo"."table1""。该表不存在或当前用户对该表没有权限。

TLDR;

问题:我不确定如何显示与我的链接服务器关联的数据库之一。

sql-server linked-server

6
推荐指数
2
解决办法
3万
查看次数

SQL Server:当数据库可能在同一台服务器上时使用 4 部分标识符

在我客户端的设置中,为了节省成本,较低环境中的数据库服务器都在一台服务器上,但在较高环境中,这些数据库部署在单独的服务器上,并且在跨服务器运行查询时使用链接服务器。

示例设置:

Dev:
  Server1: DB1, DB2
UAT: 
  Server1: DB1 (with linked server for DB2)
  Server2: DB2
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用一组 SQL Server Data Tools 项目来维护数据库,使用 4 个部分[server].[database].[schema].[object]标识符和数据库引用变量来对关系进行建模。当数据库不在同一台服务器上时这很有效,但当数据库在同一台服务器上时会失败。

我的问题:

  1. 除了省略服务器定义之外,是否有默认方法可以在 4 部分标识符中引用本地服务器?
  2. 如果没有,有没有办法添加指向本地服务器的链接服务器?
  3. 如果上述两种方法都不可能,是否有另一种方法可以在 SQL Server 中进行管理?

sql-server linked-server ssdt

6
推荐指数
1
解决办法
2226
查看次数

在引用链接服务器中的表的本地数据库中创建存储过程

我目前有一个本地服务器链接到远程服务器。

是否可以在本地服务器内创建存储过程,但从链接服务器内的表中查询数据。我知道可能存在性能问题,但我不愿意在链接服务器上创建 sp,因为它需要获得权限才能这样做。

我相信我的问题是语法,但我无法确定到底是什么,

USE [LOCALDB]  --my local database or should I reference linked server db here
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[mystoredprocedure]
    DECLARE @linkedserv NVARCHAR(150)
    DECLARE @linkeddb NVARCHAR(150)

    SET @linkedserv = 'HOSTNAME\SERVER';
    SET @linkeddb = 'remotedb';

    SELECT (CASE LTRIM(RTRIM([COLUMN1]))
        WHEN '' Then ''
        WHEN 'THIS' THEN 'THAT'
        WHEN 'NOW' THEN 'NEVER'
        ELSE 'OTHER' END) [Options]
    INTO #TempTable
    FROM @linkedserv.@linkeddb.dbo.TableOnLinkedServer --is this an issue?
    FULL OUTER JOIN OtherTableOnLinkedServer ON TableOnLinkedServer.COUMN1 = 
    OtherTableOnLinkedServer.COLUMN0   
Run Code Online (Sandbox Code Playgroud)

链接服务器 db …

sql-server stored-procedures linked-server

6
推荐指数
1
解决办法
1763
查看次数