我一直在努力使用 SQL Server Express 数据库上的触发器来验证传入记录,然后将其写入我的 Azure SQL 数据库(无服务器)。
最初,我在 SSMS(19.0 预览版 2)中将“触发 t-sql”代码作为标准查询运行;它成功了,并将 50k 条记录传输到 Azure SQL 数据库中。
然后我更新了这个 T-SQL 代码以引用 [inserted] 表,并手动插入了一行 - 无论我在使用/不使用游标、变量、BEGIN DISTRIBUTED TRANSACTION不同用户等方面做了什么,触发器都无法插入而相同的进程作为来自 SSMS 的查询运行。
BEGIN DISTRIBUTED TRANSACTION
然后我将 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](启动触发器)插入失败并显示以下消息:
[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”无法开始分布式事务,因此无法执行操作。
链接服务器“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”无法开始分布式事务,因此无法执行操作。
我真诚地希望有人可以在这方面给我指导;我已经为此苦苦挣扎了一个多月。
SQL Server (Express) 中的分布式事务依赖于 MSDTC,而云服务不存在作为 Azure SQL 数据库的 MSDTC。您不能在同一事务中在本地数据库和云数据库中包含插入。也许您最好构建一个基于变更跟踪的解决方案?