问题: 有时夜间作业会失败,当我调查它时,这是跨链接服务器的查询失败的结果。但由于某种原因,该查询似乎以某种方式保持“开放”状态并导致后续失败。
糟糕的解决方案: 我发现解决此问题的唯一方法是重新启动实例,这似乎可以清除所有内容。但当它发生在生产中时,显然有点麻烦。
问题: 是否有人有重置打开状态的链接服务器的策略?我什至不太确定幕后发生了什么。
进行的其他检查: -
唯一的解决方案是真正重新启动实例吗?
我有一个包含两个数据库项目的 VS 2013 解决方案。
其中之一,我们称之为“worker”,应该部署到大约 10 个不同的生产服务器上。
另一个应该作为“控制器”实例工作,基本上应该在 10 台生产服务器上的“工作人员”数据库上运行不同的存储过程。
因此,为了实现这一点,我在“控制器”内编写了 10 个链接服务器对象的脚本,并调用“工作器”数据库中的不同 SP。
以下是链接服务器脚本的示例:
EXEC sp_addlinkedserver @server = N'PROD1', @srvproduct=N'SQLSERVER', @provider=N'SQLNCLI', @datasrc=N'1.2.3.4\prod1'
GO
EXEC sp_addlinkedsrvlogin @rmtsrvname=N'PROD1',@useself=N'False',@locallogin=NULL,@rmtuser=N'aaaaa',@rmtpassword='aaaaa'
GO
EXEC sp_serveroption @server=N'PROD1', @optname=N'rpc', @optvalue=N'true'
GO
EXEC sp_serveroption @server=N'PROD1', @optname=N'rpc out', @optvalue=N'true'
GO
Run Code Online (Sandbox Code Playgroud)
到目前为止,效果很好,并且链接服务器是在控制器 SQL Server 上创建的,我可以使用它们。
但是:
在 SSDT 项目/解决方案中,每当我使用链接服务器对象时,我都会收到损坏的引用。当然,模式不知道链接服务器名称,因为它们仅位于上述脚本中的字符串常量中。
示例:(我自己翻译的信息,不保证完全正确)
警告 14 SQL71562:“过程:[dbo].[SP1]”包含对对象 [PROD1].[db1].[dbo].[SP1] 的未解析引用”。
所以我的问题是,我有从控制器数据库模式到“worker”数据库模式的引用,但我无法使用/插入数据库引用,因为我使用多个不同的引用(10 个生产服务器)来“访问”工作人员的架构...我不想使用“OtherServer”选项向我的项目添加 10 个数据库引用(即使可以,我猜它也不允许向同一数据库项目添加 10 个引用。 ..)
我有一种感觉,应该可以在解决方案中以正确的方式处理链接服务器对象,但我不知道如何解决。
我尝试了亚伦的同义词建议,但是一旦我使用链接服务器的名称,就会遇到同样的问题,导致名称“后面”出现未知对象。
我编辑了问题以使问题更加清晰,并希望任何人都有想法,因为我想要一个干净的解决方案,没有数百条警告消息。
visual-studio sql-server-2008-r2 linked-server ssdt database-projects
我在尝试从作业运行存储过程时遇到错误“访问远程服务器被拒绝,因为当前安全上下文不受信任。[SQLSTATE 42000](错误 15274)”,并且存储过程查询链接服务器。该作业配置为作为 SQL 登录名运行,我将其称为 user1,并且我已在每个可能的位置授予 user1 权限和所有权。
以下是该作业的设置方式:
WITH EXECUTE AS 'user1'尽管如此,我仍然遇到访问错误。我一定在某个地方遗漏了一些东西......有什么想法吗?
我做了什么:
ServerA最近,我测试了在运行 SQL Server 2016 (SP 2 CU17) 标准版到 SQL Server 2019 标准版的开发服务器上进行就地升级。(我知道这不是进行升级的首选方法,但同样只是在开发服务器上进行测试,所以没有坏处。)
在安装向导过程中,其中一个步骤挂起很长时间,因此我的同事单击“下一步”按钮跳过该步骤。我不太记得那是哪一步,但我相信它是产品更新或安装设置文件步骤。我记得接下来它说它跳过了几种不同类型的下载。剩下的安装一切顺利,顺利完成。
我能够启动实例、登录并访问我们的数据库。然后,我将数据库兼容级别提高到 150(SQL Server 2019 的兼容级别)。我运行了一些性能测试查询,然后最终决定打开旧基数估计器。到目前为止一切似乎都正常。
发生的事情是:
然后我注意到 上有一些有趣的事情ServerB,这是另一台已经运行 SQL Server 2019 的开发服务器,并且有一个指向 的链接服务器设置ServerA。一切都运行良好ServerB,除了任何跨链接服务器引用视图的查询,ServerA该视图在其中使用架构绑定标量函数。我收到错误The EXECUTE permission was denied on the object 'MyFunction', database 'Database1OnServerA', schema 'dbo'。如果我返回ServerA并更改该函数并WITH SCHEMABINDING注释掉该行,则ServerB可以从再次引用该函数的视图中进行选择。
附加信息:
链接服务器对象中使用的帐户是一个 SQL Server 登录帐户ServerA,只有映射db_datareader到它的角色(当然除了数据库角色之外)。没有对其设置额外的细粒度权限,并且也仅分配有服务器角色。Database1ServerAPublicPublic
有趣的是,我的问题的另一种解决方案是向链接服务器帐户或专门授予链接服务器帐户的EXECUTE权限。但在升级到 SQL …
sql-server upgrade linked-server sql-server-2016 sql-server-2019
将 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) 我有一个 SQL Server 实例,其中包含一个代理作业,该作业通过链接服务器访问第二个实例。有时,链接服务器的数据访问属性看似随机地从 true 更改为 false(并且代理作业开始失败)。
该代理作业在早上 5 点到晚上 8 点之间每 10 分钟运行一次,并且链接服务器的更改总是在夜间的某个时间发生,尽管我还无法确定具体时间。我确实还有其他工作——一些供应商提供的,还有其他工作,例如备份、索引和统计维护等(Ola Hallengren 的脚本)——但没有其他工作使用该链接服务器,也没有任何其他工作会明确接触它。
什么会导致链接服务器数据访问发生变化?我可以执行哪些故障排除或跟踪来确定导致此问题的原因?
如何处理对链接服务器的查询?链接服务器在收到来自远程源的查询时是否使用其优化器?有几个场景我想知道:
场景一:
存储过程/视图完全依赖于链接服务器的结果集。链接服务器是否处理所有这些并随后通过网络将结果集流式传输回主服务器?
场景二:
存储过程/视图使用本地和链接数据。我假设链接服务器返回一个结果集,然后本地服务器针对它自己的本地数据执行该结果集。我还假设本地优化器在这里没有发挥作用,因为它在提供数据集之前不知道链接服务器上的任何内容。
我想生成链接服务器及其映射登录名的列表。有谁知道怎么做?sys.sysservers 将显示服务器,但不显示登录信息。
我有 2 台装有 SQL Server 2008 R2 的服务器:INT& CRM。
我需要在 上运行一个 SSIS 包INT,它使用来自INT数据库和CRM数据库的数据。慢得令人痛苦。
我试过这个来测试一个简单的查询(上INT):
EXEC sp_addlinkedserver @server='CRM',
@srvproduct='',
@provider='SQLNCLI',
@datasrc='<IP of CRM>'
EXEC sp_addlinkedsrvlogin
@useself='FALSE',
@rmtsrvname='CRM',
@rmtuser='<username>',
@rmtpassword='<userpassword>'
Run Code Online (Sandbox Code Playgroud)
我还在服务器<username>上赋予了ddl_admin 角色CRM,如此答案中所建议的:
跨链接服务器远程查询的 SQL 性能问题
然后我运行这个查询:
UPDATE [CRM].DB.dbo.table1
SET field = 1
WHERE id = (SELECT id FROM [CRM].DB.dbo.table2 WHERE secondary_id = 9999)
Run Code Online (Sandbox Code Playgroud)
此查询在CRM自身运行时需要 40 毫秒才能运行。在上面的例子中运行需要 30 秒。没有返回结果,不可能是网络问题,为什么要这么长时间?
这是我用来将链接服务器注册到 SSAS 的代码:
USE [master];
GO
EXEC master.dbo.sp_addlinkedserver
@server = N'ServerAlias',
@srvproduct = N'',
@provider= N'MSOLAP',
@datasrc= N'ActualServerName',
@catalog = N'DatabaseName';
Run Code Online (Sandbox Code Playgroud)
当我尝试使用 运行 MDX 查询时OPENQUERY,或者如果我在运行上述代码后在 Management Studio 中使用测试连接命令,我会收到错误消息:
消息 7403,级别 16,状态 1,第 1 行
OLE DB 提供程序“MSOLAP”尚未注册。
这很奇怪,因为此提供程序是作为 SQL Server 的一部分安装的。