标签: linked-server

如何在托管数据库和本地数据库之间复制数据

我有一个由不同公司维护的云托管数据库。这是我的场景:

  • 云托管数据库 SQL Server 2012 - 需要通过 VPN 连接。
  • 我们设置了一个带有双网卡的本地服务器。这允许我们拥有 VPN 连接和本地网络连接。
  • 我想在我们的服务器上有一个云托管数据库的本地副本。
  • 我无法在 SQL 服务器内设置复制,我没有云服务器的权限。
  • 我无法备份和恢复数据库 - 我没有云服务器的权限。
  • 我不能使用触发器
  • 我不能使用日志。
  • 我不能使用备份

如何关闭整个数据库、模式和数据,并保持我的本地数据库实时更新?

编辑:我能够从托管公司运行脚本,因此我可以创建数据库以及架构和初始数据。

最重要的问题是如何让数据保持实时同步?现在,我正在考虑在 SQL 中执行一系列作业来查询链接服务器数据库,如下所示:

insert into local_table_1
select * from linkedserver_table1
except
select * from local_table_1
Run Code Online (Sandbox Code Playgroud)

问题是,它效率不高,并且不会提取任何更新的记录。我们确实有一个“Updated_date”字段。如何更新本地服务器,从链接服务器中选择所有记录,并更新本地数据库?

sql-server linked-server sql-server-2012

5
推荐指数
1
解决办法
2917
查看次数

链接服务器的 ODAC OLE DB 提供程序“OraOLEDB.Oracle”为列提供了不一致的元数据

我使用 SQL Server 2014 链接服务器连接到 Oracle 11gR2 (11.2.0.3) 数据库,使用 ODAC 12.1.0.2.4 Oracle OLE DB 提供程序。我有一个存储过程,它位于 SQL 2014 数据库中,并使用以下语法通过链接服务器将本地表中的数据插入到远程 Oracle 表中:

insert into LinkedServerName..RemoteSchema.RemoteTable(column) 
select column from localSQLServerTable
Run Code Online (Sandbox Code Playgroud)

但是,我在插入行中收到以下错误:

消息 7356,级别 16,状态 1,过程 {MyProcName},第 1 行链接服务器“{MyLinkedServer}”的 OLE DB 提供程序“OraOLEDB.Oracle”为列提供了不一致的元数据。据报告,对象“{remote table name}”的列“{columnName}”(编译时序数为 23)在编译时的“DBCOLUMNFLAGS_ISFIXEDLENGTH”为 16,在运行时为 0。

有问题的列在 Oracle 中定义为CHAR(1 BYTE)数据类型。

安装了“64 位 ODAC 12c 第 4 版 (12.1.0.2.4) Xcopy for Windows x64”,从http://www.oracle.com/technetwork/database/windows/downloads/index-下载名称“ODAC121024Xcopy_x64.zip” 090165.html

sql-server linked-server sql-server-2014

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

在链接服务器上运行内置函数

我们有两台 SQL 2014 服务器,我在其中一台上创建了一个链接服务器到另一台上。作为我尝试运行的任务的一部分,我需要将 SQL 用户 ID 转换为本地和链接服务器上的用户名。

在本地服务器上,我可以调用

SELECT SUSER_NAME(1)
Run Code Online (Sandbox Code Playgroud)

这将返回字符串 sa

是否有一种简单的方法可以SUSER_NAME在链接服务器上运行该函数以从那里获取值?

我认为我发现的另一种选择是加入sys.server_principals并从那里拉出名称,但SUSER_NAME似乎是一种更清洁的方法。

sql-server linked-server functions sql-server-2014

5
推荐指数
1
解决办法
1309
查看次数

重新索引/重建链接服务器表上的索引

我正在尝试运行以下查询以在链接服务器上的表上重建索引,但它不起作用。任何人都可以让我知道我做错了什么吗?

ALTER INDEX ALL ON [LinkedServerName].[dbname].[dbo].[tablename] REBUILD 
WITH (FILLFACTOR = 90)
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

找不到对象“[LinkedServerName].[dbname].[dbo].[tablename]”,因为它不存在或您没有权限。

index sql-server-2008 sql-server linked-server

5
推荐指数
1
解决办法
654
查看次数

SQL Server 2014 上的慢速链接服务器插入

我的本地和远程服务器都使用 SQL Server 2008 R2,但本地服务器最近升级到 SQL Server 2014,并且远程查询的性能受到影响(字面上从几分钟到几小时)。

看来问题在于将数据发送到远程服务器,所以,只要我只是从远程服务器读取数据,它就可以正常执行,只是,如果查询是基于本地端的数据,则似乎是有效地将数据发送到远程服务器。我无法在远程服务器端设置链接服务器,所以我无法从本地服务器拉取远程服务器。

在大多数情况下,我可以重写查询以将数据从远程服务器拉到本地表中,过滤本地数据,然后将相对较少的更新发送到远程服务器 - 仍然比以前慢,但功能正常。

然而,当做任何涉及大量记录的事情时,它是不可用的。典型的例子是这个查询(最初它在本地服务器上执行更复杂的查询,所以我将其更改为首先填充最终表的本地副本,以便我可以对 INSERT 执行最简单的查询);

INSERT INTO [REMOTE-DB].Databasename.dbo.Test_Table
SELECT Person_Nbr, FullName, Birth
FROM Test_Table WITH (nolock)
Run Code Online (Sandbox Code Playgroud)

即使当我尝试 OPENQUERY 时,它似乎也没有更快;

INSERT OPENQUERY ([REMOTE-DB], 'SELECT Person_Nbr, FullName, Birth FROM Databasename.dbo.Test_Table')
SELECT Person_Nbr, FullName, Birth
FROM Test_Table WITH (nolock)
Run Code Online (Sandbox Code Playgroud)

如果不是这在旧版本的 SQL Server 上几乎立即起作用,我会接受这是一个事实,但性能差异如此巨大,似乎必须有一些我遗漏的明显修复. 我无法控制本地服务器,但他们的 DBA 声称数据库配置与旧设置一致。

你有什么想法我可以做些什么来解决这个问题,或者我可以指点 DBA 吗?

sql-server insert linked-server sql-server-2014

5
推荐指数
1
解决办法
2357
查看次数

链接服务器到 Azure 错误:“访问远程服务器被拒绝,因为不存在登录映射。”

我正在设置从本地 SQL Server 到 MS Azure 上的数据库的链接服务器(见下文)。当非管理员用户通过链接服务器查询 Azure 数据库时,他们会得到:

Msg 7416, Level 16, State 2, Line 1 访问远程服务器被拒绝,因为不存在登录映射。

关于如何让这个工作的任何想法?

EXEC sp_addlinkedserver
@server='LincServer',                              
@srvproduct='',     
@provider='sqlncli',
@datasrc='myAzureDB.database.windows.net',
@location='',
@provstr='Encrypt=Yes;TrustServerCertificate=No;User ID=myAzureID',
@catalog='MyDB'

EXEC sp_addlinkedsrvlogin 
@rmtsrvname = 'LincServer',
@useself = 'false',
@rmtuser = 'myAzureID',
@rmtpassword = '########'
GO
Run Code Online (Sandbox Code Playgroud)

sql-server linked-server azure-sql-database

5
推荐指数
1
解决办法
2689
查看次数

选择并插入链接服务器

我遇到了无法理解的链接服务器的情况。

所以我们有一个从 2008R2 服务器到 2014 服务器的链接服务器。下面的示例查询是从 2008R2 服务器执行的,并且工作正常。

SET XACT_ABORT ON;
 Declare @BatchSize int = 10
      DELETE from LINKEDSRV.DB.DBO.Table
      INSERT INTO LINKEDSRV.DB.DBO.Table (ECN)
      SELECT TOP (10) C1 from LINKEDSRV.DB.DBO.Table22 --order by C1
      SELECT * FROM LINKEDSRV.DB.DBO.Table
Run Code Online (Sandbox Code Playgroud)

但是当我用order by C1它执行同样的事情时,它不会返回任何结果。

第二种情况 - 如果我替换TOP(10)withTOP(@BatchSize)和 noorder by也不会得到任何结果。例如

SELECT TOP (@BatchSize) C1 from LINKEDSRV.DB.DBO.Table22 
Run Code Online (Sandbox Code Playgroud)

如果我SET XACT_ABORT OFF. 那么 XACT_ABORT 对链接服务器有任何限制吗?

编辑- 进行了更多测试,看起来它也与行数有关

可能的回购

在服务器 A 上

use testdb
go
create table t1( c1 …
Run Code Online (Sandbox Code Playgroud)

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

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

非常偶发无法初始化链接服务器的 OLE DB 提供程序“SQLNCLI11”的数据源对象

链接服务器“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 周,然后它会正常工作数周。不确定它是否相关,但是当我们看到这个时,应用程序偶尔也会显示线程中止,但我认为这更像是一种症状。

  • 双方的链接服务器和帐户已通过脚本和 GUI 以及已知的工作链接服务器手动重新创建。我已经多次确认他们没有被锁定并且拥有正确的权限。
  • 我增加了双方的最大查询超时。
  • SQLNCLI11.DLL 驱动程序位于与 SQL Server 安装相同版本的两台服务器上。
  • SQL 管理或错误日志中没有显示任何明显的登录失败、损坏或奇怪行为。
  • 我们在任何一方的服务器事件日志中都看不到任何内容。
  • 我们的网络和安全团队进行了检查,并没有发现位于同一交换机上且未通过防火墙的连接和流量方面的任何问题。
  • 端口是开放的。
  • 当这些问题发生时,来自链接服务器的测试连接工作正常,我通常可以通过临时访问底层问题表,但不能访问存储过程的代码,甚至就地运行。

我在这里缺少什么?

sql-server linked-server errors connections

5
推荐指数
1
解决办法
2429
查看次数

TLS 1.2 破坏 SQL Server 链接服务器

作为最近的安全闪电战的一部分,我们在所有服务器上设置了 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 linked-server tls-1.2

5
推荐指数
1
解决办法
1865
查看次数

如何停止在链接服务器中使用 sql server 登录凭据?

我有一个位于意大利的链接服务器,server_italia它连接到位于美国俄勒冈州的服务器ORDB1

我们在不同但受信任的域上

从连接server_italiaORDB1通过链接服务器使用具有登录和所要求的权限的SQL Server的帐户进行ORDB1

我是一个sysadmin甚至domain admin在我的域中,而我的server_italia但我只sysadmin在 .sql server 中ORDB1

有一个类似的问题:

如何使用 Windows 身份验证使链接服务器正常工作?

但它没有提供the答案。

这是我的链接服务器:

在此处输入图片说明

当我运行以下查询时,server_italia我得到以下结果:

SELECT [the_server]=@@servername,
auth_scheme 
FROM sys.dm_exec_connections WHERE session_id = @@spid ;  


SELECT net_transport, auth_scheme   
FROM sys.dm_exec_connections   
WHERE session_id = @@SPID; 
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在俄勒冈州,我得到了这个:

在此处输入图片说明

如果我的美国同事得到:

  1. 为您的服务帐户运行的服务注册服务主体名称

  2. 在他们的服务器上设置 Kerberos 身份验证

  3. 配置约束委派,因为这将允许传递凭据,否则您可能仍会遇到双跳问题。– 在John Eisbrener的评论中添加

我可以在linked …

sql-server linked-server logins kerberos connectivity

5
推荐指数
1
解决办法
509
查看次数