数据库属性

时间:2019-01-02 20:12:37

标签: sql sql-server database uniqueidentifier

公司网络上有多个SQL Server实例,它们均具有唯一的名称,但是每个实例都有相同的数据库名称,例如ClientDB。我知道每个数据库都有一个数据库ID,但是我想知道是否存在一个可以在实例之间工作的唯一标识符?现在,我写这篇文章听起来很傻,一个新实例如何知道那里已经存在的数据库名称? 我之所以这样问是因为我正在将所有数据库的信息(例如名称,创建者,大小,最后备份的信息等)收集到一个表中,并且由于许多记录具有相同的数据库名称,这会造成混乱。也许某处有实例ID或数据库GUID,或者我是否只需要同时跟踪实例和数据库名称以识别记录?感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

您需要在数据库名称前添加“主机”。主机也称为:

  • “计算机名”,“主机名”,“主机名”。
  • “服务器”或“服务器名称”,“计算机名称”。
  • “盒子”。
  • “ vm”或“ vm name”。

答案 1 :(得分:0)

它称为composite key。由于仅数据库名称不足以在资产中唯一标识数据库名称,因此您需要在表中添加其他属性。

  • @@server_name来标识盒子上的MS SQL Server实例以及盒子名称;
  • db_name()或从sys.databases中进行选择以获取该实例上的数据库名称。

它们共同构成了在大多数情况下足够独特的密钥。但是请注意,如果发生以下情况,您仍然可能会发生碰撞:

  • 您的网络中有多个AD域,并且某些服务器在不同的域中具有重复的名称。糟糕的网络设计决策本身;我会在这里尝试从实例名称切换为IP地址,或者在您的SQL Server版本支持的情况下添加default_domain()函数;
  • 您已将SQL实例集群化。本身不是冲突,而是记录中的重复项;只需确保您不使用群集节点的名称,或者保留单独的群集/ AlwaysOn实例列表即可解决此问题。自己还没有实际检查过,在这里可能是错误的。

答案 2 :(得分:0)

在SQL Server中创建后,分配给每个数据库(mastermodel除外)的service_broker_guid属性可以满足您的需求。 service_borker_guidGlobal 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。