问题描述
我正在使用 sqlprovider 驱动程序并在创建新记录时遇到问题 - 这似乎使驱动程序无用。
let foundProductMaybe = query {
for p in ctx.Dbo.Products do
where (p.DefaultsupplierSku.Value = pl.supplierSku)
select (Some p)
exactlyOneOrDefault
}
match foundProductMaybe with
| Some foundProduct ->
updateProduct(foundProduct,pl,ctx)
| None -> addProduct(pl,ctx)
product.Id <- Guid.NewGuid()
product.Code <- "some code"
.... etc
ctx.SubmitUpdates()
我收到错误:
System.Data.sqlClient.sqlException: '如果 DML 语句的目标表 'dbo.Products' 包含没有 INTO 的 OUTPUT 子句,则不能有任何启用的触发器
是否有解决方法?
解决方法
在我看来,这是一个与 SQL Server 相关的问题,不一定是 SQLServerProvider。这是一篇讨论此行为机制的文章。 https://techcommunity.microsoft.com/t5/sql-server/update-with-output-clause-8211-triggers-8211-and-sqlmoreresults/ba-p/383457
在 SqlProvider 中生成 OUTPUT 语句的代码出现在这里:https://github.com/fsprojects/SQLProvider/blob/8afaad203efe2b3b900a2ad1a6d8a35d66ebe40a/src/SQLProvider.Runtime/Providers.MsSqlServer.fs#L370
OUTPUT 子句仅在表具有主键时生成。
也许您可以更改表并将主键替换为 UNIQUE 约束,这在功能上与 PK 约束非常接近,并且不会影响您的情况。 https://docs.microsoft.com/en-us/sql/relational-databases/tables/create-unique-constraints?view=sql-server-ver15
唯一约束(和主键)作为表上的索引实现。由于您使用的是非顺序 GUID,您可以考虑确保将这些索引创建为 NONCLUSTERED。