【问题标题】:How can I clear down a table if the user exits?如果用户退出,我如何清理表格?
【发布时间】:2017-04-07 15:18:18
【问题描述】:

所以我有用户将文件上传到我的服务器进行处理。内容被读取到 SQL 表中,出于所有意图和目的,将其称为 ImportedData。然后用户对其进行操作,然后当他们要提交数据进行处理时,将数据提交到上游系统(这里不重要),然后从所述表中删除数据。

但是,在某些情况下,用户进行了导入,然后出于某种原因决定离开页面,关闭浏览器并回家休息一天,你有什么。影响是行将留在 ImportedData 中。

现在我最初的想法是只运行一个代理作业来删除任何超过一天的行;用户不太可能希望能够在第二天早上处理数据。

但是,有没有“更好”的方法?

该应用程序是使用 MVC ASP.Net Razor 前端、后端中的所有 C#、实体框架等构建的。我只是想知道我可以做些什么来从 ImportedData 中删除特定于该导入的数据(唯一该确切导入会话的 GUID),因此当用户进行任何类型的不干净注销时,该导入特有的数据会被删除?

【问题讨论】:

  • 用例子来解释你过程中的每一步都会有很大帮助
  • 您是否正在将内容写入数据库,因为它们正在被您的后端读取?

标签: c# sql asp.net-mvc sql-server-2012


【解决方案1】:

我建议不要直接删除行。您可以为存储过程安排一个作业,将旧数据加载到临时表中并保留到下一次执行存储过程。

逻辑是:

Create procedure Name
AS
BEGIN
(
IF EXISTS(SELECT * FROM SYS.TABLES WHERE NAME = N'...')
BEGIN
DROP TABLE ...
END
CREATE TABLE TABLE_NAME
...
INSERT INTO TABLE_NAME
SELECT ..
FROM YOUR_TABLE
)
END

只要确保数据得到保存,以防发生一些不情愿的事情。

【讨论】:

    【解决方案2】:

    这是您可能会做的一件事:您可以在相关页面上添加一些 javascript,以定期、合理的时间间隔(可能每几分钟一次)对服务器进行 ajax 调用,这只会向用户的浏览器仍在查看该记录的服务器。您可以在相应的数据库记录上更新某种 LastClientHeartbeat 时间戳,以表明它仍在被查看。然后,在您定期安排的清理作业中,您可以对其进行编程以跳过删除 LastClientHeartbeat 时间戳相对较新(在最后几分钟内)的文件,因为这表明用户仍然在浏览器中打开该页面。

    这不是一个非常复杂的解决方案,但实施起来非常简单,并且(大部分)可以防止您意外删除用户只是花时间完成工作的文件。

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多