【发布时间】:2020-02-13 15:27:32
【问题描述】:
我有 SQL Server 2017 Express 数据库,最多可供 6 台平板电脑访问,这些平板电脑使用 REST Web 服务通过 Angular 7 应用程序连接。
我有一个允许将新用户插入特定数据库表的存储过程。插入总是一次只插入 1 条记录,但是对于 6 个客户端,每个客户端几乎可以同时调用存储过程。
该过程的最后一步是将协议表单打印到特定打印机。最初这将在客户端处理,但平板电脑无法打印到网络打印机,因此该功能现在需要驻留在服务器端。
根据这一新要求,协议表单是一个正在读取的 RTF 文档,占位符值替换为插入语句中的值,写入临时文件,然后通过应用程序打印到网络打印机(很可能是写字板)与 RTF 文件格式相关联。
还有一个 MS Access 前端应用程序,它使用链接服务器连接到数据库,但没有创建新用户的能力,但需要能够启动“打印协议”操作因打印机问题、网络问题等导致协议无法打印的情况。
我编写了 C# 代码来执行表单的读取/修改/写入/打印操作,该表单使用 UseShellExecute StartInfo 属性和 Process.Start 方法。
由于文件读取/修改/写入/打印过程需要几秒钟,我担心存储过程会在这段时间内添加注册阻塞。
我很确定我需要一个 CLR 存储过程,以便 MS Access 前端可以启动打印操作,所以我想出的是“Add_Registration”存储过程(Transact-SQL ) 将调用 CLR 存储过程来执行读取/修改/写入/打印操作,或调用 CLR 存储过程读取/修改/写入/打印的表上的插入触发器(CLR 或 Transact-SQL)。
如果有令人信服的理由,我可以通过在 CLR 触发器和 CLR 存储过程中复制代码来避免从触发器调用存储过程,但如果可能的话,我会尽量避免重复代码。
我目前考虑的解决方案如下,但不确定SQL Server如何处理各种场景:
注册表上的 CLR 或 Transact-SQL
Insert触发器调用执行读取/修改/写入/打印过程的 CLR 存储过程。执行读取/修改/写入/打印过程的 CLR 存储过程,从当前的
add_registrationTransact-SQL 存储过程调用
我不断重复的问题是:
InsertCLR 触发器是如何执行的,如果多个插入同时或几乎同时完成(每个操作只有 1 个),它们是排队然后同步处理还是立即执行?与 #1 相同的问题,但使用 Transact-SQL 触发器
如果 CLR 存储过程被多个客户端同时或几乎同时调用,它们是排队然后同步处理,还是立即执行对存储过程的每个调用,如何处理它们?
除了 Transact-SQL 存储过程之外,问题与 #3 相同
如果从 Transact-SQL 触发器调用 CLR 存储过程,触发器是在存储过程返回之前被阻塞,还是对存储过程的调用通过触发立即返回?
与 #5 相同的问题,但 CLR 触发器调用 CLR 存储过程
我正在寻找有关 SQL Server 如何处理这些场景的任何其他建议和/或说明。
【问题讨论】:
-
对我来说,这听起来更像是一份报告,而不是一堆 CLR。您是否为此考虑过 SSRS 报告?这将比使用 CLR 的过程和触发器简单一百万倍。
-
我应该更清楚地了解这些协议。我查看了报告服务,但是非常缺乏经验的用户需要使用他们拥有和知道的工具修改协议,因此客户决定他们可以使用 Word 做到“最好”(我至少让他们同意 RTF 格式,因为它更容易编辑)。
-
你知道SSRS可以直接导出到Word吗?每个报告顶部的工具栏右侧都有一个小圆盘图标。您可以在当前查看器或 Excel、pdf 或 Word 中打开报告。对于没有经验的用户来说,再简单不过了。 :D
-
@SeanLange 没有导出到 Word 是问题所在,输出文件在打印后未保存。问题在于他们能够使用他们拥有和知道的工具来修改文档模板,而不必为了修改文档模板而学习新东西。我读到的有关 Reporting Services 的一点信息表明您必须使用与 SSDT 一起安装的 Report Builder 或 Report Designer。
-
是的,要开发报表,您必须使用报表设计器。但最终用户甚至不知道该工具的存在。他们只需单击应用程序中的某些内容,即可在特定 url 处打开网页(使用查询字符串值向报告提供一些信息)。用户只是在 Web 浏览器中看到报告。他们没有能力修改报告的模板。但听起来在你的情况下他们无论如何都没有,所以这没什么大不了的。
标签: sql-server stored-procedures clr database-trigger sqlclr