【问题标题】:Database Properties数据库属性
【发布时间】:2019-01-02 20:12:36
【问题描述】:
公司网络上有多个 SQL Server 实例,它们的名称都是唯一的,但是,每个实例都有相同的数据库名称,例如 ClientDB。我知道每个都有一个数据库 ID,但我想知道是否有一个可以跨实例工作的唯一标识符?现在我写这个听起来很傻,一个新实例怎么会知道已经存在的数据库名称?
我之所以问,是因为我正在将我们所有数据库的信息(例如名称、创建者、大小、上次备份等)收集到一个表中,并且由于许多记录具有相同的数据库名称,它会变得令人困惑。也许某处有实例 ID 或数据库 GUID,或者我只需要跟踪实例和数据库名称来识别记录?感谢您的帮助。
【问题讨论】:
标签:
sql
sql-server
database
uniqueidentifier
【解决方案1】:
您需要在数据库名称前加上“主机”。主机也称为:
- “机器名”、“主机名”、“主机名”。
- “服务器”或“服务器名称”、“计算机名称”。
- “盒子”。
- “虚拟机”或“虚拟机名称”。
【解决方案2】:
它叫做composite key。由于单独的数据库名称不足以在您的资产中唯一标识它,因此您需要为表带来额外的属性。
-
@@server_name 标识盒子上的 MS SQL Server 实例以及盒子名称;
-
db_name() 或从 sys.databases 中选择以获取该实例上的数据库名称。
在大多数情况下,它们共同构成了一个足够独特的密钥。但是请注意,如果出现以下情况,您仍然可能会发生冲突:
- 您的网络中有多个 AD 域,并且某些服务器在不同域中有重复名称。一个糟糕的网络设计决策本身;如果您的 SQL Server 版本支持,我会尝试从实例名称切换到 IP 地址,或者添加
default_domain() 函数;
- 您有集群 SQL 实例。本身不是冲突,而是您的记录中的重复;只需确保您不使用集群节点的名称,或保留单独的集群/AlwaysOn 实例列表来解决此问题。自己没有实际检查过,这里可能有误。
【解决方案3】:
在 SQL Server 中创建时分配给每个数据库(master 和 model 除外)的 service_broker_guid 属性可以满足您的需求。 service_borker_guid 是 Global Unique Identifier,也称为 UUID。
Wikipedia page 说明了您在网络内外发现两个相同值的可能性:
虽然 UUID 被复制的概率不为零,但它是
足够接近于零,可以忽略不计
下面的查询将获取您要查找的 GUID。
select @@servername as host_nm, name as db_nm, service_broker_guid
from master.sys.databases
where name in ('ClientDB')
输出:
+----------------+----------+--------------------------------------+
| host_nm | db_nm | service_broker_guid |
+----------------+----------+--------------------------------------+
| MY_SERVER_NAME | ClientDB | 9B7C1BF1-022D-423D-9780-88B555459868 |
+----------------+----------+--------------------------------------+
如果您想了解有关该主题的更多详细信息,DBA 网站上的This question 会详细说明 GUID。