如何检测SQ​​L Server数据库已恢复

use*_*749 1 database sql-server backup restore

SQL Server数据库实例有什么独特之处,可以检测到它已经恢复.如果客户端正在使用数据库并决定在另一台服务器上恢复并运行同一数据库的另一个副本 - 有没有办法用t-sql查询来区分这两个数据库?

Rem*_*anu 5

有几种方法可以将数据库标识为另一个数据库的还原/副本:

  • service_broker_guid通常是最简单的方法.它是在创建数据库时生成的,并在还原/附加操作期间保留.它可以使用ALTER DATABASE ... SET NEW_BROKER;如此不同的GUID 显式更改,但不一定意味着不同的DB.但是相同的GUID意味着数据库的共同起源.
  • dbi_familyGUID是一个未记录的引导页面字段,在还原时保留.
  • 恢复路径和恢复分支LSN记录在案,可用于识别共同的起源,但它们快速分歧,即使最近恢复的数据库很快就会通过简单地使用fork LSN而丢失与另一个数据库的共同起源的痕迹.
  • 加密数据库(只要加密密钥没有改变就可以通过页面随机数(未记录的方法,需要专业知识)轻松识别TDE(即,不强制不重新加密,丢失所有随机数).
  • 应用层方法可以使用代码签名:生成密钥对,签署虚拟模块,删除私钥.由于签名永远不会被重新生成(私钥被永久丢弃),因此数据库的副本无法隐藏其原点而不会删除签名,这显然是明显的篡改.

如您所见,有几种方法,所需的专业水平和他们提供的篡改证据的程度各不相同.它归结为您的要求和实际用例.最后,请记住SQL Server 不是 DRM产品.如果您有一些您认为非常宝贵并且必须受到保护的代码/设计,那么您应该将应用程序作为托管服务提供,以便这种感知到的IP永远不会离开您的物理控制环境.