微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法将行插入包含触发器的 SQL Server 表F Sharp SQL Provider

如何解决无法将行插入包含触发器的 SQL Server 表F Sharp SQL Provider

我正在使用 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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。