存储过程和触发器执行阻止

问题描述 投票:0回答:1

我有SQL Server 2017 Express数据库,最多可通过REST Web服务通过Angular 7应用程序连接的6台平板电脑访问。

我有一个存储过程,允许将新用户插入特定的数据库表。插入一次总是只能插入1条记录,但是对于6个客户端,每个客户端几乎可以同时调用存储过程。

该过程的最后一步是将协议表格打印到特定打印机。最初,这将在客户端进行处理,但平板电脑无法打印到网络打印机,因此功能现在需要驻留在服务器端。

有了这个新要求,协议表是一个正在读取的RTF文档,占位符值将替换为insert语句中的值,并写入一个临时文件,然后通过应用程序(最可能是写字板)打印到网络打印机,与RTF文件格式关联。

还有一个MS Access前端应用程序,该应用程序使用链接的服务器连接到数据库,但是不具有创建新用户的能力,但是需要能够在客户端中启动“打印协议”操作。由于打印机问题,网络问题等导致无法打印协议的情况。

我编写了C#代码以执行读取/修改/写入/打印使用UseShellExecute StartInfo属性和Process.Start方法的表单的动作。

由于文件读取/修改/写入/打印过程需要几秒钟,所以我担心在这段时间内要使用存储过程来添加注册阻止。

我很确定我将需要一个CLR存储过程,以便MS Access前端可以启动打印操作,所以我想出的就是“ Add_Registration”存储过程(Transact-SQL)将调用CLR存储过程来执行读/修改/写/打印操作,或者在调用CLR存储过程来读/修改/写/打印的表上插入插入触发器(CLR或Transact-SQL)。

如果有令人信服的理由,我可以通过在CLR触发器和CLR存储过程中都复制代码来避免从触发器到存储过程的调用,但是如果可能的话,试图避免重复代码。] >

我目前正在考虑的解决方案如下,但是不确定SQL Server如何处理各种情况:

  1. 注册表上的CLR或Transact-SQL Insert触发器调用执行读取/修改/写入/打印过程的CLR存储过程。

  2. 用于执行读取/修改/写入/打印过程的CLR存储过程,从当前的add_registration Transact-SQL存储过程中调用

  3. 我一直回想的问题是:

  1. Insert CLR触发器如何同时执行或几乎同时执行(每个操作仅执行一次),是将它们排队,然后同步处理还是立即执行?

  2. 与#1相同,但带有Transact-SQL触发器

  3. 如果多个客户端同时或几乎同时调用CLR存储过程,它们将排队,然后同步处理,还是立即执行对存储过程的每次调用?

  4. 与#3相同的问题,除了带有Transact-SQL存储过程的问题

  5. 如果从Transact-SQL触发器调用CLR存储过程,则该触发器被阻塞直到该存储过程返回,还是该存储过程的调用随其返回而产生给它自己的过程(或类似方法)立即吗?

  6. 与#5相同,但带有CLR触发器调用CLR存储过程的问题

  7. 我正在寻找有关SQL Server如何处理这些方案的其他建议和/或说明。

我拥有SQL Server 2017 Express数据库,最多可通过REST Web服务通过Angular 7应用程序连接的6台平板电脑访问。我有一个存储过程,允许插入新用户...

sql-server stored-procedures clr database-trigger sqlclr
1个回答
0
投票

除非您自己实施,否则没有排队,并且有几种方法可以实现。因此,对于多个并发会话,它们都独立起作用。当然,当涉及到写入数据库(INSERT /UPDATE/DELETE/等)时,它们显然会按照提交请求的顺序进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.