Max*_*ojo 6 sql-server sql-server-2014
我有一个独特的问题(至少对我而言),我已经以一种方式解决了这个问题,但如果可能的话,我想要一种更简单的方法:)
我经常需要用过去的日期来测试我们的 Windows 应用程序。我们的应用程序查询使用 GETDATE 的 SQL 服务器。
我已经设置了一个带有我们的应用程序和 SQL 服务器的虚拟机。通过powershell执行以下操作后,我可以根据需要向后或向前更改系统日期:
它似乎工作得很好 - 我们的应用程序和 SQL 服务器都无法区分。
如果我需要将日期重置回当前,我只需重新启动 Windows 时间服务。简单。
但是,在某些时候设置它需要一些努力,并且想知道是否有办法让SQL 服务器或单个数据库根据需要认为它是不同的日期?
因此,对于单个数据库,也许我可以设置一些属性,以便将 GETDATE 调用移回某个时间段。
我知道所有的延伸,但如果有人有任何其他想法,我会全神贯注。
不幸的是,我们的开发人员无法更改应用程序来简化这一切。
简短的回答:不。要求开发人员解决问题。
答案很长:绕过系统调用是可能的。例如,请参阅使用 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)
您可以用您自己的函数(例如,ACMEGETDATE如果您公司的名称是 ACME)替换 GETDATE(和等效项)的所有实例,并让该函数直接返回 GETDATE,或者在检测某些情况时(例如服务器名称以“test”开头),DATEADD(GETDATE(), ...)从一个全局表什么的。
这将对生产造成影响,因此您必须权衡此解决方案在多大程度上降低开发和测试成本(并提高产品的输出)与任何可能明显的性能下降和其他风险(性能、兼容性等)。
| 归档时间: |
|
| 查看次数: |
2767 次 |
| 最近记录: |