一尘不染

SQL Server 2019 Express:读取/写入 SQL Server 数据库(无服务器) - 在 SSMS 中工作,但在 INSERT 触发器中失败

sql

我一直在努力使用 SQL Server Express 数据库上的触发器来验证传入记录,然后将其写入我的 Azure SQL 数据库(无服务器)。

最初,我在 SSMS(19.0 预览版 2)中将“触发 t-sql”代码作为标准查询运行;它成功了,并将 50k 条记录传输到 Azure SQL 数据库中。

然后我更新了这个 T-SQL 代码以引用 [inserted] 表,并手动插入了一行 - 无论我在使用/不使用游标、变量、BEGIN DISTRIBUTED TRANSACTION不同用户等方面做了什么,触发器都无法插入而相同的进程作为来自 SSMS 的查询运行。

然后我将 INSERT 触发器简化为一个简单的:

CREATE TRIGGER [dbo].[tc_table_ITrig]
ON [dbo].[tc_table]
AFTER INSERT
AS
BEGIN
    INSERT INTO [SQL_Database].[DatabaseName].[schema].[Table]([Var1], [Var2], [Var3], [Var4])
        SELECT 1, 2, 3, 4
END;
GO

如果我在 SSMS 中运行该语句,它会成功

如果我插入[dbo].[tc_table](启动触发器)插入失败并显示以下消息:

链接服务器“SQL_Database”的 OLE DB 提供程序“MSOLEDBSQL”返回消息“参数不正确。”。

消息 7399,级别 16,状态 1,过程 tc_positions_ITrig,第 13 行 [批处理开始行 0]
链接服务器“SQL_Database”的 OLE DB 提供程序“MSOLEDBSQL”报告错误。提供者报告一个或多个参数无效。

消息 7391,级别 16,状态 2,过程 tc_table_ITrig,第 13 行 [批处理开始行 0]
由于链接服务器“SQL_Database”的 OLE DB 提供程序“MSOLEDBSQL”无法开始分布式事务,因此无法执行操作。

我真诚地希望有人可以在这方面给我指导;我已经为此苦苦挣扎了一个多月。


阅读 91

收藏
2022-07-22

共1个答案

一尘不染

SQL Server (Express) 中的分布式事务依赖于 MSDTC,而云服务不存在作为 Azure SQL 数据库的 MSDTC。您不能在同一事务中在本地数据库和云数据库中包含插入。也许您最好构建一个基于变更跟踪的解决方案?

2022-07-22