诱使 SQL 服务器认为这是一个不同的日期

Max*_*ojo 6 sql-server sql-server-2014

我有一个独特的问题(至少对我而言),我已经以一种方式解决了这个问题,但如果可能的话,我想要一种更简单的方法:)

我经常需要用过去的日期来测试我们的 Windows 应用程序。我们的应用程序查询使用 GETDATE 的 SQL 服务器。

我已经设置了一个带有我们的应用程序和 SQL 服务器的虚拟机。通过powershell执行以下操作后,我可以根据需要向后或向前更改系统日期:

  • 停止 Windows 时间服务
  • 如果在 HyperV 上运行,请停止 vmictimesync 服务
  • 设置新日期
  • 重启时间服务
  • 重新启动 sql 服务器(以防万一)和我们的应用程序

它似乎工作得很好 - 我们的应用程序和 SQL 服务器都无法区分。

如果我需要将日期重置回当前,我只需重新启动 Windows 时间服务。简单。

但是,在某些时候设置它需要一些努力,并且想知道是否有办法让SQL 服务器或单个数据库根据需要认为它是不同的日期

因此,对于单个数据库,也许我可以设置一些属性,以便将 GETDATE 调用移回某个时间段。

我知道所有的延伸,但如果有人有任何其他想法,我会全神贯注。

不幸的是,我们的开发人员无法更改应用程序来简化这一切。

Rem*_*anu 9

简短的回答:不。要求开发人员解决问题。

答案很长:绕过系统调用是可能的。例如,请参阅使用 Detours 修改应用程序行为(出于应用程序兼容性原因)。这允许您修改特定进程的系统调用结果。在链接的示例中,它是GetSystemTime调用,作者修改它以返回过去的日期。您可以sqlservr.exe在绕行环境中执行类似操作并加载并返回您选择的日期。

但是,我不会称这种方法比修改系统时钟更“容易”。而且肯定风险更大。更不用说,我什至不确定这会GETDATE转化为对GetSystemTime...的调用。


你也可以试试RunAsDate

RunAsDate 是一个小实用程序,允许您在指定的日期和时间运行程序。此实用程序不会更改计算机的当前系统日期和时间,而只会将您指定的日期/时间注入所需的应用程序。

查看您的服务参数(例如sc.exe qc MSSQLSERVER)。您必须匹配启动参数(sc.exe 报告为BINARY_PATH_NAME启动用户(即SERVICE_START_NAME)。如果您没有以正确的用户身份运行,您将无法访问所需的文件(master、tempdb、logs 等)。

请参见如何:启动 SQL Server 实例 (sqlservr.exe)


Eze*_*nay 6

您可以用您自己的函数(例如,ACMEGETDATE如果您公司的名称是 ACME)替换 GETDATE(和等效项)的所有实例,并让该函数直接返回 GETDATE,或者在检测某些情况时(例如服务器名称以“test”开头),DATEADD(GETDATE(), ...)从一个全局表什么的。

这将对生产造成影响,因此您必须权衡此解决方案在多大程度上降低开发和测试成本(并提高产品的输出)与任何可能明显的性能下降和其他风险(性能、兼容性等)。