我将 SQL Server 2012 设置为 SQL Server 2008 服务器上的链接服务器。
以下查询在不到 1 秒内执行:
SELECT kg.IdGarment
FROM Products p
INNER JOIN ZAMStaffRentals r ON r.ProductID = p.UniqueID
INNER JOIN ZAMCustomer_Staff s ON r.StaffID = s.UniqueID
INNER JOIN ZAMRentalGarments g ON g.StaffRentalID = r.UniqueID
INNER JOIN [REMOTE_SERVER].[REMOTE_DB].dbo.t_ProcessIT_Garment kg on g.BarcodeRFID = kg.IdGarment
INNER JOIN ZAMKannChanges log on log.GarmentID = g.UniqueID
WHERE log.ActionType = 'I'
Run Code Online (Sandbox Code Playgroud)
t_ProcessIT_Garment包含 37,000 行,查询返回两条记录,IdGarment 列为主键。这里没问题。
但是,如果我运行此查询进行远程更新,则需要 24 秒,并且会影响 2 行:
UPDATE [REMOTE_SERVER].[REMOTE_DB].dbo.t_ProcessIT_Garment SET
IdGarment = IdGarment
FROM Products p …Run Code Online (Sandbox Code Playgroud) 在 MySQL 中,我可以使用联合表查询另一台服务器上的信息,只要我在本地定义了相同的表结构。
但是,在 MS SQL Server 中,我可以对链接服务器运行任何 SQL 语句。是否可以在 MySQL 中做同样的事情?
我有一个新的 SQL Server 2012 实例,并且正在从 SQL Server 2000 迁移数据库。数据库中的一些存储过程我正在移动引用另一个数据库回到该 2000 服务器上。处理这个问题的最佳方法是什么?
链接服务器会有帮助吗?我在创建测试链接时遇到问题。有些人推荐使用 ODBC,其他人似乎使用 SQL Server 10 客户端驱动程序 (SQLNCLI10)。使用 SQL Server 10 客户端驱动程序对我来说似乎更好,在 SQL Server 2012 实例上安装它有问题吗?
我有一个在 IAAS 提供程序上运行的远程数据库,我需要能够从我的本地工作站执行联合查询。我遇到了麻烦,因为当我尝试创建链接时,它试图使用命名管道进行连接。
我使用 SQL Server Native Client 10 创建了一个系统 DSN,并向其提供 IP、数据库、用户和密码。测试了它,它很好。
单击“确定”后,我收到一条错误消息,提示它找不到服务器,并显示它正在尝试使用命名管道。
我应该怎么做才能纠正这个问题?
所以有一个链接服务器。但是,在展开目录下拉列表后,我目前无法从 SSMS 中查看与该链接服务器关联的所有数据库。我的理解是这可能是权限问题。但是,我不确定我需要授予哪些权限才能与来自链接服务器的 tat db 进行交互。
有任何想法吗?
从链接服务器执行以下命令后:
select * from [<server>].[<database>].[dbo].table1
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
链接服务器 "" 的 OLE DB 访问接口 "SQLNCLI10" 不包含表 """."dbo"."table1""。该表不存在或当前用户对该表没有权限。
TLDR;
问题:我不确定如何显示与我的链接服务器关联的数据库之一。!
在我客户端的设置中,为了节省成本,较低环境中的数据库服务器都在一台服务器上,但在较高环境中,这些数据库部署在单独的服务器上,并且在跨服务器运行查询时使用链接服务器。
示例设置:
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]标识符和数据库引用变量来对关系进行建模。当数据库不在同一台服务器上时这很有效,但当数据库在同一台服务器上时会失败。
我的问题:
我目前有一个本地服务器链接到远程服务器。
是否可以在本地服务器内创建存储过程,但从链接服务器内的表中查询数据。我知道可能存在性能问题,但我不愿意在链接服务器上创建 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 …
链接服务器“001”的 OLE DB 访问接口“SQLNCLI11”返回消息“由于打开服务器连接延迟,无法完成登录过程”。消息 7303,级别 16,状态 1,第 19 行无法初始化链接服务器“001”的 OLE DB 访问接口“SQLNCLI11”的数据源对象。
我意识到有很多潜在适用的 SO 帖子和谷歌点击(其中许多我已经阅读了很多次),所以让我来看看我们所看到的和我们已经尝试过的。老实说,我现在不知道还有什么可看的。
我们将链接服务器 001(目标)转到 002(源)作为 SQL 登录名,该登录名从 C#/.Net 应用程序代码作为 proc 通过数据访问方法和 SSPI 连接字符串通过具有适当权限的服务帐户调用。我相信 .Net 版本是 4.3,现在是 4.7,但问题在两者中都存在。它是从不同网络上的旧 2008R2 环境迁移而来的,这在物理设备上从来都不是问题,而且两个新的当前都是 64 位 2016 虚拟机。
它在问题期间始终可重现,但在其他情况下则不然,并且似乎总是相同的调用。对于阻塞/死锁/奇怪的锁定页面或对象,sp_what 中没有显示任何内容。如果未报告该问题,则该问题将无法重现。有时它只发生一次或两次,有时持续 10-15 周,然后它会正常工作数周。不确定它是否相关,但是当我们看到这个时,应用程序偶尔也会显示线程中止,但我认为这更像是一种症状。
我在这里缺少什么?
作为最近的安全闪电战的一部分,我们在所有服务器上设置了 TLS 1.2。昨晚我在我们所有的 SQL Server 上翻转了“强制加密”标志,从那时起我在链接服务器上遇到了一个奇怪的问题。
我有两台服务器;
服务器 A 运行 SQL Server 2016 SP2 CU3
运行 SQL Server 2012 SP4 的服务器 B
两者都有正确的加密证书,都有必要的注册表编辑来禁用 SSL 和 TLS 1.0 和 1.1,只启用 TLS 1.2。两者都在 SQL Server Config Mgr 中设置了证书并设置了“强制加密”。
从服务器 A 到 B(2016 年到 2012 年)的链接服务器工作正常。从服务器 B 到 A(2012 年到 2016 年)的链接服务器显示服务器并列出数据库,但任何通过该链接服务器查询表的尝试都会生成错误:
TCP Provider: The specified network name is no longer available. (Microsoft SQL Server, Error: 64)
但是,我可以在服务器 B 上启动 SQL Server Management Studio 会话并连接到服务器 A 就好了。所以只有链接服务器有问题。
我检查了服务器 A 上的扩展事件,我可以看到使用 TLS 1.2 来自服务器 …
将 SQL Server 从 2019 年升级到 2022 后,以下使用链接服务器的查询开始失败(为了简单起见,我省略了一些列名称和详细信息):
UPDATE [<remote server>].[<remote db>].dbo.Projects
SET RemoteColumnName = p.LocalColumnName
FROM prod.Projects p
WHERE p.ProjectID = Projects.ProjectID;
Run Code Online (Sandbox Code Playgroud)
然而,不涉及本地表工作的基本更新就很好了。SQL Server 报告以下错误,我什至在文档中找不到该错误:
UPDATE [<remote server>].[<remote db>].dbo.Projects
SET RemoteColumnName = p.LocalColumnName
FROM prod.Projects p
WHERE p.ProjectID = Projects.ProjectID;
Run Code Online (Sandbox Code Playgroud)
两台服务器都是 SQL Server 2022,在升级之前一切正常。
为本地和远程表添加 DDL,以防万一。但是,问题似乎与模式无关,并且在具有不同数据类型的不同表上重现。
-- Table on the remote linked server
CREATE TABLE dbo.Projects
(
ProjectID BIGINT NOT NULL,
RemoteColumnName VARCHAR(255) NOT NULL,
CONSTRAINT PK_Projects PRIMARY KEY CLUSTERED (ProjectID)
)
-- Table on the local server
CREATE …Run Code Online (Sandbox Code Playgroud) linked-server ×10
sql-server ×9
connections ×1
errors ×1
mysql ×1
ssdt ×1
tls-1.2 ×1
update ×1