标签: linked-server

如何防止插入查询注册到分布式事务?

我在存储过程中有一个 SQL Insert 查询,用于将行插入到链接服务器表中。

由于在父事务中调用了存储过程,因此此 Insert 语句尝试使用 DTC 将行插入链接服务器。

我想避免DTC 参与进来。

有什么方法可以让插入 SQL 语句忽略事务范围(如提示)?

sql sql-server msdtc transactions linked-server

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

你可以在SQLServer 2k5中的链接服务器表视图上有一个外键吗?

我有一个带有链接服务器的SQLServer到另一个其他数据库.我在该链接服务器上创建了一个视图

create view vw_foo as
select
[id],
[name]
from LINKEDSERVER.RemoteDatabase.dbo.tbl_bar
Run Code Online (Sandbox Code Playgroud)

我想谈谈以下内容

alter table [baz] 
add foo_id int not null
go

alter table [baz] with check 
add constraint [fk1_baz_to_foo] 
  foreign key([foo_id]) 
  references [dbo].[vw_foo] ([id])
go
Run Code Online (Sandbox Code Playgroud)

但是这会产生错误:"外键'fk1_baz_to_foo'引用对象'dbo.vw_foo',它不是用户表."

如果我尝试使用以下内容将外键直接放在表上

alter table [baz] with check 
add constraint [fk1_baz_to_bar] 
  foreign key([foo_id]) 
  references LINKEDSERVER.RemoteDatabase.dbo.tbl_bar ([id])
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

对象名称"LINKEDSERVER.RemoteDatabase.dbo.tbl_bar"包含的前缀数量超过最大数量.最大值为2.

有什么方法可以达到同样的效果吗?

sql sql-server sql-server-2005 foreign-keys linked-server

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

SQL Server链接服务器查询内存不足

我在网络共享上有一个DBF文件,我正在尝试选择一个SQL Server表.

这个查询:

SELECT * FROM OPENQUERY(MyLinkedServer, 'SELECT * FROM DP')
Run Code Online (Sandbox Code Playgroud)

...抛出此错误:

用于链接服务器"MyLinkedServer"的OLE DB提供程序"MSDASQL"返回消息"[Microsoft] [ODBC Visual FoxPro驱动程序]没有足够的内存用于文件映射."
消息7399,级别16,状态1,行11链接服务器"MyLinkedServer"的OLE DB提供程序"MSDASQL"报告错误.提供程序内存不足.
消息7320,级别16,状态2,行11无法针对链接服务器"MyLinkedServer"对OLE DB提供程序"MSDASQL"执行查询"SELECT*FROM DP".

我已经读过使用SYS(3050)来释放FoxPro的内存.我无法弄清楚如何针对链接服务器执行该操作.

sql-server foxpro linked-server

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

在没有通过TSQL链接的情况下在另一个SQL Server上调用Sproc

我想在TSQL中从服务器A调用服务器B上的sproc而不链接服务器.是否可以使用类似连接字符串的东西来执行此sproc?返回值将是单个nvarchar值.

问候.

sql sql-server linked-server

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

如何将 IBM DB2 服务器添加到 SQL Server 的链接服务器

从 .Net,我可以连接到 DB2 数据库:

  1. 首先,我引用了“IBM.Data.DB2.iSeries”
  2. 然后我创建一个新的 IBM.Data.DB2.iSeries.iDB2Connection。连接字符串是

    DataSource=ChaDb2Server;UserID=MyUsername;Password=MyPassword;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后我创建了一个 IBM.Data.DB2.iSeries.iDB2Command,等等。

现在我试图让我的 SQL Server 2005 直接访问相同的数据。在 SQL Server Management Studio 中,我右键单击链接服务器,然后选择“新建链接服务器...”

Linked Server:   ChaDb2Server
Provider:        IBM OLE DB Provider for DB2
Product Name:    ???
Data Source:     ChaDb2Server
Provider String: DataSource=ChaDb2Server;UserID=MyUsername;Password=MyPassword;
Location:        ???
Run Code Online (Sandbox Code Playgroud)

我可以将 Location 留空,但 Product Name 不能为空,我不知道在这里填写什么。

在“安全”选项卡上,我选择“使用此安全上下文制作”并重复用户 ID 和密码。

链接服务器已创建,但是当我尝试展开目录/默认/表时,我收到一条错误消息:

OLE DB provider 'IBMDADB2.DB2COPY1' reported an error. Authentication failed. (Microsoft SQL Server, Error: 7399)
Run Code Online (Sandbox Code Playgroud)

我不知道 IBMDADB2.DB2COPY1 这个名字从何而来。

另外,当我尝试选择数据时:

Select * from ChaDB2Server.ChaDb2Server.Information_Schema.Tables
Run Code Online (Sandbox Code Playgroud)

我收到类似的错误:

Msg 7399, Level 16, State 1, …
Run Code Online (Sandbox Code Playgroud)

sql-server db2 linked-server

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

两个问题.相同的输出.一个需要2个小时,另一个需要0秒.为什么?

我有一些ID插入临时表#A,如下所示:

SELECT DISTINCT ID
INTO #A
FROM LocalDB.dbo.LocalTable1
WHERE ID NOT IN (SELECT DISTINCT ID FROM LocalDB.dbo.LocalTable2)
GO

CREATE INDEX TT ON #A(ID)
GO
Run Code Online (Sandbox Code Playgroud)

我试图使用我在上一阶段收集的标识符从远程链接服务器获取一些信息:

查询1:

SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
WHERE ID IN (SELECT ID FROM #A)
Run Code Online (Sandbox Code Playgroud)

查询2:

SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
INNER JOIN #A Y
ON X.ID = Y.ID
Run Code Online (Sandbox Code Playgroud)

现在在下面的查询中,我正在做的是获取临时表的输出,复制行并将它们格式化为逗号分隔列表并手动将其放入查询中.

问题3:

SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
WHERE ID IN (-- Put all identifiers here --)
Run Code Online (Sandbox Code Playgroud)

查询12花费2个小时来执行和查询3需要0秒(我的临时表包含大约200行).我不知道发生了什么,也没有权限来检查远程服务器是否在ID上有相关的索引,但是看到手动构造的查询在没有时间运行表明存在错误的情况,这简直令人费解.在查询优化阶段. …

sql linked-server query-optimization sql-server-2008

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

以另一个用户的身份执行对链接服务器的查询

我想执行一个使用链接服务器作为特定用户的查询。但是,甚至没有一个简单的示例可以工作。

当我以用户“ domain \ user”的身份使用SSMS时,连接到“ serverA”并运行以下代码:

EXECUTE ('SELECT col FROM serverB.dbB.dbo.table')
Run Code Online (Sandbox Code Playgroud)

它工作正常。

但是,当我以用户“ domain \ admin”的身份使用SSMS时,请连接到“ serverA”并运行以下代码:

EXECUTE ('SELECT col FROM serverB.dbB.dbo.table') AS LOGIN = 'domain\user'
Run Code Online (Sandbox Code Playgroud)

它引发以下错误:

如果没有模拟登录名的映射,则无法在链接下使用链接服务器。

我已经搜索了很多,但是还没有找到任何解决方案。有人知道问题可能在哪里吗?

sql-server impersonation linked-server

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

签名激活过程中的不可信安全上下文

我有一个用于查询链接服务器的服务代理队列的激活过程。我已使用此处找到的方法签署了该程序。但是,我不断在 sql server 日志中看到以下消息:

在队列 'DBName.dbo.TestReceiveQueue' 上运行的激活过程 '[dbo].[TestProc]' 输出以下内容: '访问远程服务器被拒绝,因为当前安全上下文不受信任。

奇怪的是我在同一个数据库中有几个不同的激活程序,由同一个证书签名,也做链接服务器查询,并且工作正常。出于某种原因,这个程序拒绝。

这是一些(主要)重现问题的代码。我已经创建了证书和关联的登录名。

CREATE PROCEDURE TestProc
WITH EXECUTE AS OWNER
AS
BEGIN
    SET NOCOUNT ON;

DECLARE @convHandle UNIQUEIDENTIFIER;
DECLARE @msgTypeName SYSNAME;
DECLARE @status TINYINT;
DECLARE @srvName NVARCHAR(512);
DECLARE @srvConName NVARCHAR(256);
DECLARE @msgTypeValidation AS NCHAR(2);
DECLARE @msgBody NVARCHAR(256);
DECLARE @cmd AS NVARCHAR(50);


RECEIVE TOP(1)
        @convHandle = conversation_handle,
        @msgTypeName =  message_type_name,
        @status = status,
        @srvName = service_name,
        @srvConName = service_contract_name,
        @msgTypeValidation = validation,
        @msgBody = CAST(message_body AS NVARCHAR(256))
        FROM TestReceiveQueue;

    --SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures linked-server service-broker sql-server-2014

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

查询链接服务器时登录失败

我正在尝试在 SQL Server 中创建链接服务器:

--Create the link to server "uranium"
EXEC master.dbo.sp_addlinkedserver 
      @server = N'uranium', 
      @srvproduct=N'', 
      @provider=N'SQLNCLI'

--Add the catch-all login with SQL Server authentication
EXEC master.dbo.sp_addlinkedsrvlogin 
      @rmtsrvname=N'uranium',
      @useself=N'False',
      @locallogin=NULL,
      @rmtuser=N'BatteryStaple',
      @rmtpassword='Horsecorrect'
Run Code Online (Sandbox Code Playgroud)

它创造良好。但是任何查询链接服务器的尝试,例如:

SELECT * FROM uranium.Periodic.dbo.Users
Run Code Online (Sandbox Code Playgroud)

结果是

Msg 18456, Level 14, State 1, Line 1
Login failed for user 'BatteryStaple'.
Run Code Online (Sandbox Code Playgroud)

除了我知道凭据是正确的:

  • 登录: BatteryStaple
  • 密码: Horsecorrect

因为当我使用 SQL Server Management Studio 或任何其他能够连接到数据库的技术直接连接时,我可以登录。

在此处输入图片说明

奖励阅读

sql-server linked-server

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

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

我试图MSSqlserver使用链接服务器将数据从 Oracle 提取到数据库。

select * from [LINK_NAME]..SCHEMA.TABLE;
Run Code Online (Sandbox Code Playgroud)

但它因以下错误而失败:

链接服务器“LINK_NAME”的 OLE DB 提供程序“OraOLEDB.Oracle”为列提供了不一致的元数据。对象 ""SCHEMA"."TABLE"" 的列 "COLUMN_NAME"(编译时序数为 6)在编译时为 100,在运行时为 200。

我还需要在运行时在 where 条件下传递参数。我发现 OPENQUERY 作为解决方案,但它在运行时不支持参数。

sql-server oracle linked-server

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