openrowset与触发器:为什么这个openrowset函数在查询分析器可以,而在触发器不行?
现有电脑A、B,上面的数据库分别dbA(表tbA)、dbB(表tbB),其中表tbA与tbB完全一样。
表tbA的结构:
id int;
name nvarchar(50)
现在A机的查询分析器执行:
select * from openrowset('sqloledb','B' ; 'sa' ; '' , dbB.dbo.tbB )
insert into openrowset('sqloledb','B' ; 'sa' ; '' , dbB.dbo.tbB) values(10,'lyw')
上面两个命令时对的。但是在A机的数据库dbA上的表tbA上建立触发器insert_trig1:
CREATE TRIGGER insert_trig1 ON [dbo].[tbA]
FOR INSERT
AS
insert into openrowset('SQLOLEDB','B' ; 'sa' ; '' , dbB.dbo.tbB ) select * from inserted
当执行insert into tbA values(1,'abc')时,等了很久(N秒),报错:
服务器: 消息 7391,级别 16,状态 1,过程 ins_trig1,行 4
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
怎么办?请教请教!
表tbA的结构:
id int;
name nvarchar(50)
现在A机的查询分析器执行:
select * from openrowset('sqloledb','B' ; 'sa' ; '' , dbB.dbo.tbB )
insert into openrowset('sqloledb','B' ; 'sa' ; '' , dbB.dbo.tbB) values(10,'lyw')
上面两个命令时对的。但是在A机的数据库dbA上的表tbA上建立触发器insert_trig1:
CREATE TRIGGER insert_trig1 ON [dbo].[tbA]
FOR INSERT
AS
insert into openrowset('SQLOLEDB','B' ; 'sa' ; '' , dbB.dbo.tbB ) select * from inserted
当执行insert into tbA values(1,'abc')时,等了很久(N秒),报错:
服务器: 消息 7391,级别 16,状态 1,过程 ins_trig1,行 4
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
怎么办?请教请教!
...全文
相关推荐
sqlserver调用OPENROWSET的方法[参照].pdf
OPENROWSET 函数可以用来实现分布式查询、数据迁移和数据集成等功能。
16、T-SQL 行动查询:删除与更新操作详解
本文详细介绍了 T-SQL 中的行动查询,包括删除、更新和插入操作。重点讲解了 DELETE 和 TRUNCATE TABLE 在删除数据时的区别与使用场景,UPDATE 语句的语法与限制,以及处理文本或图像列的 WRITETEXT 和 UPDATETEXT 语句。此外,还涵盖了 INSERT 和 SELECT INTO 的基本用法及注意事项。文章通过示例代码演示了各种语句的实际应用,并总结了不同操作的适用场景与最佳实践,帮助开发者高效、安全地管理数据库中的数据。
本地查询分析器中连接局域网内的其他数据库
- **权限配置**:确保本地查询分析器有足够的权限来访问远程服务器,并且远程服务器也必须允许来自本地服务器的连接请求。
使用 OpenRowSet 和 OpenDataSource 访问 Excel 97
可以通过在查询语句中使用 `COALESCE` 函数来解决此问题,例如:```sqlSELECT COALESCE([Column], '默认值') AS Column FROM ...```####
在SQLServer里使用OpenRowSet查询Sybase数据库.docx
在这种情况下,我们可以利用SQL Server的`OpenRowSet`函数来实现跨数据库的查询。


