1

这个问题是我之前的问题的后续问题:SQL Server:是否需要验证数据修改?

我做了一些谷歌搜索,论文(我无法访问)“当 CRC 和 TCP 校验和不一致时”表明未经检查的错误率为 1 到 1600 万到 100 亿个数据包中的 1 个。因此,为了使错误的插入/更新/删除成功,该错误必须影响 sql 语句中的值或关键字(以语法正确的方式)。这意味着 SQL Server 接收并执行错误 sql 语句的概率甚至比论文中指出的要低得多。

我想知道的是是否还有其他东西可以进一步降低接收到错误 sql 语句的可能性或允许检测到它:

  • sql 语句是否包含校验和,SQL Server 检查该校验和以验证语句的完整性?
  • 是否可以检索 SQL Server 收到的最后一条 sql 语句以与发送的 sql 语句进行比较?这在计算上比查询数据库以检查是否正确接收发送的 sql 语句的计算成本更低,尽管与后一种技术不同,它无法检查 sql 语句是否正确执行。
  • 我遗漏的任何其他内容,您认为可能有用。

如果您想知道,我正在研究的是一个军事应用程序,它解释了他们需要的高度完整性。

谢谢你。

4

4 回答 4

2

简单的答案是它可以工作,或者每几十亿次调用它就因为某种原因不起作用。在这种级别上,没有健全的机制来检查这种错误率。

您既不能保证 100% 的正常运行时间,也不能保证 100% 的可靠性。您的客户端和 SQL Server 之间存在磁盘、内存、网络、CPU 等错误。

坦率地说,并且曾在军事软件上工作过(并且有与之相匹配的战争故事),我建议您应该询问他们想要使用什么平台,而不是您必须向他们证明使用 SQL Server 的合理性。或者简单地说“不可能”,然后看看会发生什么:他们要么想要软件,要么不想要。

如果软件也需要这种完整性,那么它也应该用 ADA 编写,而不是 COTS。

听起来您有人出于某种原因不想使用 SQL Server,仅此而已...

于 2010-08-29T08:35:24.503 回答
1

您在询问传输级别消息的完整性,这是由 SSL/TLS 保证的。请参阅加密与 SQL Server 的连接。SSL/TLS 不仅可以防止有人在客户端到服务器的通道上掉线,它还可以防止中间人、消息欺骗和消息更改,换句话说,它可以保证消息的完整性。使用 SSL/TLS 加密通道,您可以保证服务器处理的文本是客户端发送的文本。

关于 TCP 校验和:与遇到消息相比,您遇到随机内存位翻转或 CPU 位翻转(即服务器收到数据包后出现硬件错误)的机会要高得多(实际上非​​常好)保留校验和并产生有效 SQL的更改。

于 2010-08-29T15:57:55.627 回答
0

查看SQL Server 使用的TDS 协议。我在那里找不到任何对校验和或 CRC 的引用——所以我会说这是一个“不”的问题。

AFAIK 不可能直接从 SQL Server 获取“执行的最后一个查询”——如果这是一个要求,你需要以某种方式记录这些——你可能会发现你会从动态管理视图中获得一些里程——你当然可以使用这些来获取已经或已经为特定 SPID 执行的 SQL 语句,但我不知道这对您是否有用。

假设您的查询没有格式错误——如何阻止内存损坏或磁盘损坏破坏数据?当然,您也可以对这些“层”进行错误检查/恢复——但没有什么是 100% 保证的。

于 2010-08-29T08:23:39.320 回答
0

作为替代方案,使用 OUTPUT 子句返回每个 DML 操作的结果。然后应用程序确认返回的值与提供的值匹配,并做出适当的响应。

问题来自于测试。您如何充分测试每十亿次调用中只发生一次的事情?你没有。您模拟错误,但随后您正在测试模拟,而不是真实的东西。

于 2010-08-30T01:42:28.753 回答