SQL Server 数据库实例是否有任何独特之处可以检测到它已恢复。如果客户端正在使用数据库并决定在不同的服务器上恢复和运行同一数据库的另一个副本 - 有没有办法通过 t-sql 查询区分两者?
最佳答案
有几种方法可以将数据库标识为另一个数据库的还原/副本:
-
service_broker_guid
通常是最简单的方法。它在创建数据库时生成,并在还原/附加操作期间保留。可以使用ALTER DATABASE ... SET NEW_BROKER;
显式更改它,因此不同的 GUID 不一定意味着不同的数据库。但相同的 GUID 意味着数据库的共同来源。 - dbi_familyGUID是在还原时保留的未记录的引导页字段。
- 恢复路径和recovery fork LSNs已记录并可用于识别共同来源,但它们分歧很快,即使是最近恢复的数据库也将通过简单地使用 fork LSN 很快失去与另一个数据库的共同来源的踪迹。
- 加密数据库(TDE 可以通过页面随机数轻松识别(未记录的方法,需要专业知识)只要加密 key 没有更改(即没有强制重新加密,丢失所有随机数) .
- 应用层方法可以使用代码签名:生成 key 对,签署虚拟模块,删除私钥。由于永远无法重新生成签名(私钥永远被删除),数据库的副本无法隐藏其来源而不删除签名,这显然是 tamper evident .
如您所见,有多种方法,所需的专业知识水平和它们提供的篡改证据的程度各不相同。它归结为您的要求和实际用例。最后,请记住 SQL Server 不是 DRM 产品。如果您认为某些代码/设计非常宝贵并且必须受到保护,那么您应该将应用程序作为托管服务提供,这样感知到的 IP 永远不会离开您的物理控制环境。
关于sql-server - 如何检测一个SQL Server数据库是否已经恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14660838/