SQL Server 数据库实例是否有任何独特之处,可以检测到它是否已恢复。如果客户端正在使用数据库并决定在不同的服务器上恢复并运行同一数据库的另一个副本 - 有没有办法通过 t-sql 查询来区分两者?
问问题
1252 次
2 回答
5
有几种方法可以将数据库标识为另一个数据库的还原/副本:
service_broker_guid
通常是最简单的方法。它在创建数据库时生成,并在还原/附加操作期间保留。可以使用显式更改它,ALTER DATABASE ... SET NEW_BROKER;
因此不同的 GUID 不一定意味着不同的数据库。但相同的 GUID 意味着数据库的共同来源。- dbi_familyGUID是在还原时保留的未记录引导页字段。
- 恢复路径和恢复分支 LSN已记录在案,可用于识别共同来源,但它们快速分歧,即使最近恢复的数据库也会很快失去与另一个数据库共同来源的痕迹,只需使用分支 LSN。
- 加密的数据库(TDE可以通过页面 nonce 轻松识别(未记录的方法,需要专业知识),只要不更改加密密钥(即不强制完全重新加密,丢失所有 nonce)。
- 应用层方法可以使用代码签名:生成密钥对、签署虚拟模块、删除私钥。由于签名永远无法重新生成(私钥被永久删除),因此数据库的副本无法隐藏其来源而不删除签名,这显然是篡改的。
如您所见,有多种方法,所需的专业知识水平和它们提供的篡改证据的程度各不相同。它归结为您的要求和实际用例。最后,请记住 SQL Server不是DRM 产品。如果您有一些您认为非常宝贵且必须受到保护的代码/设计,那么您应该将应用程序作为托管服务提供,以便该感知 IP 永远不会离开您的物理控制环境。
于 2013-02-02T11:56:17.020 回答
0
数据库开发人员和管理员经常使用 GUID 作为数据库表的主键,以确保数据库之间的唯一性。有关比较 GUID 的材料:http: //msdn.microsoft.com/en-us/library/ms254976.aspx
于 2013-02-04T16:48:05.277 回答