获取SQL Server 2005及更高版本的唯一数据库标识符

5
有没有一种方法可以从SQL 2005数据库中获取唯一的数据库标识符(如GUID)?
我发现了这篇文章:http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.database.databaseguid%28v=sql.90%29.aspx。但我需要能够从T-SQL而不是VB中获取DatabaseGuid。
编辑:我正在尝试唯一确定我连接的数据库。通过代码,我手动在SQL Compact和SQL Server之间同步记录。现在我的用户在测试环境中,当他们将来指向生产SQL时,我将需要重新同步整个表而不是依赖rowversion。如果我能检测到数据库GUID更改,我就可以重新同步整个表。
谢谢。

你是否正在寻找一个用于识别整个数据库的ID? - Joe
1
您的查询不清楚,请重新表述。 - user1425057
@Joe,是的。我正在寻找一种唯一标识整个数据库的方法,这样如果管理员将我的终端用户应用程序从测试切换到生产环境,我就可以根据新的行版本(时间戳)重新同步他们的本地数据库。 - geekinit
4个回答

7
无论SMO使用何种方式获取数据库GUID,您都应该能够做到相同。如果您在弄清楚SMO正在执行什么方面遇到问题,可以使用分析器来监视其执行内容并找出答案。
在这种情况下,SMO可能会从sys.database_recovery_status中读取database_guid值:

用于将数据库的所有文件关联在一起。所有文件必须在其头页中具有此GUID,以使数据库按预期启动。只应该有一个数据库具有此GUID,但是通过复制和附加数据库可以创建副本。还原时,当您还原尚不存在的数据库时,总是会生成新的GUID。


好主意。我不知道为什么我没有想到使用Profiler。我目前没有使用SMO,但可以尝试使用跟踪功能。我查看了sys.databases并看到与我的数据库相关联的file_guid,但不确定是否相同。我会调查一下,并在明天回复您。谢谢。 - geekinit
你是正确的。我编写了一个基于SMO的小应用程序,它返回与“select database_guid from sys.database_recovery_status”完全相同的GUID。 - geekinit
我还在分析器中运行了一个跟踪,SMO确实从sys.database_recovery_status获取了它。 - geekinit

6

对于其他想要返回数据库GUID的查询的人:

SELECT d.name, drs.database_guid, d.group_database_id 
FROM sys.databases d 
JOIN sys.database_recovery_status drs
ON d.database_id = drs.database_id

该函数返回数据库名称,数据库全局唯一标识符以及其在可用性组中的唯一标识符。如果该数据库未加入可用性组,则最后一个值返回null。该函数适用于SQL Server 2016。


1

我不知道SMO返回哪个GUID,但你可以使用

select service_broker_guid from sys.databases

对于除了 master 和 model 之外的所有数据库,其值都不等于 Guid.Empty。

我发现并不是所有的数据库都有非空的 sys.database_recovery_status.database_guid,正如 Remus 所建议的那样。

在 SQL2008 上进行测试。



0

实际上,我使用了分析器来查找数据库_guid确实来自sys.database_recovery_status,这是我捕获的代码:



    exec sp_executesql N'SELECT
    ISNULL((case dmi.mirroring_redo_queue_type when N''UNLIMITED'' then 0 else dmi.mirroring_redo_queue end),0) AS [MirroringRedoQueueMaxSize],
    ISNULL(dmi.mirroring_connection_timeout,0) AS [MirroringTimeout],
    ISNULL(dmi.mirroring_partner_name,'''') AS [MirroringPartner],
    ISNULL(dmi.mirroring_partner_instance,'''') AS [MirroringPartnerInstance],
    ISNULL(dmi.mirroring_role,0) AS [MirroringRole],
    ISNULL(dmi.mirroring_safety_level + 1, 0) AS [MirroringSafetyLevel],
    ISNULL(dmi.mirroring_state + 1, 0) AS [MirroringStatus],
    ISNULL(dmi.mirroring_witness_name,'''') AS [MirroringWitness],
    ISNULL(dmi.mirroring_witness_state + 1, 0) AS [MirroringWitnessStatus],

    CAST(case when dmi.mirroring_partner_name is null then 0 else 1 end AS bit) AS [IsMirroringEnabled],
    ISNULL(dmi.mirroring_guid,''00000000-0000-0000-0000-0000000000000000'') AS [MirroringID],
    ISNULL(dmi.mirroring_role_sequence,0) AS [MirroringRoleSequence],
    ISNULL(dmi.mirroring_safety_sequence,0) AS [MirroringSafetySequence],
    ISNULL(dmi.mirroring_failover_lsn,0) AS [MirroringFailoverLogSequenceNumber],
    dtb.is_ansi_null_default_on AS [AnsiNullDefault],
    dtb.is_ansi_nulls_on AS [AnsiNullsEnabled],
    dtb.is_ansi_padding_on AS [AnsiPaddingEnabled],
    dtb.is_ansi_warnings_on AS [AnsiWarningsEnabled],
    dtb.is_arithabort_on AS [ArithmeticAbortEnabled],
    dtb.is_auto_shrink_on AS [AutoShrink],
    dtb.is_cursor_close_on_commit_on AS [CloseCursorsOnCommitEnabled],
    dtb.is_concat_null_yields_null_on AS [ConcatenateNullYieldsNull],
    dtb.is_numeric_roundabort_on AS [NumericRoundAbortEnabled],
    dtb.is_quoted_identifier_on AS [QuotedIdentifiersEnabled],
    dtb.is_read_only AS [ReadOnly],
    dtb.is_recursive_triggers_on AS [RecursiveTriggersEnabled],
    dtb.is_local_cursor_default AS [LocalCursorsDefault],
    dtb.page_verify_option AS [PageVerify],
    dtb.recovery_model AS [RecoveryModel],
    dtb.user_access AS [UserAccess],
    dtb.is_db_chaining_on AS [DatabaseOwnershipChaining],
    dtb.is_auto_update_stats_async_on AS [AutoUpdateStatisticsAsync],
    dtb.is_date_correlation_on AS [DateCorrelationOptimization],
    dtb.is_trustworthy_on AS [Trustworthy],
    dtb.name AS [Name],
    dtb.database_id AS [ID],
    dtb.create_date AS [CreateDate],
    dtb.is_auto_create_stats_on AS [AutoCreateStatisticsEnabled],
    dtb.is_auto_update_stats_on AS [AutoUpdateStatisticsEnabled],
    dtb.is_parameterization_forced AS [IsParameterizationForced],
    dtb.is_read_committed_snapshot_on AS [IsReadCommittedSnapshotOn],
    dtb.is_auto_close_on AS [AutoClose],
    dtb.is_broker_enabled AS [BrokerEnabled],
    CAST(isnull(dtb.source_database_id, 0) AS bit) AS [IsDatabaseSnapshot],
    ISNULL(DB_NAME(dtb.source_database_id), N'''') AS [DatabaseSnapshotBaseName],
    dtb.is_fulltext_enabled AS [IsFullTextEnabled],
    dtb.service_broker_guid AS [ServiceBrokerGuid],
    dtb.snapshot_isolation_state AS [SnapshotIsolationState],
    (dtb.is_published*1+dtb.is_subscribed*2+dtb.is_merge_published*4) AS [ReplicationOptions],
    ISNULL(suser_sname(dtb.owner_sid),'''') AS [Owner],
    ISNULL(dtb.log_reuse_wait,0) AS [LogReuseWaitStatus],
    drs.recovery_fork_guid AS [RecoveryForkGuid],
    drs.database_guid AS [DatabaseGuid],
    CAST((case when drs.last_log_backup_lsn is not null then 1 else 0 end) AS bit) AS [HasFullBackup],
    CAST(case when dtb.name in (''master'',''model'',''msdb'',''tempdb'') then 1 else dtb.is_distributor end AS bit) AS [IsSystemObject],
    CAST(case when ctb.database_id is null then 0 else 1  end AS bit) AS [ChangeTrackingEnabled],
    CAST(ISNULL(ctb.is_auto_cleanup_on,0) AS bit) AS [ChangeTrackingAutoCleanUp],
    ISNULL(ctb.retention_period,0) AS [ChangeTrackingRetentionPeriod],
    CAST(ISNULL(ctb.retention_period_units,0) AS tinyint) AS [ChangeTrackingRetentionPeriodUnits],
    dtb.containment AS [ContainmentType],
    dtb.default_language_lcid AS [DefaultLanguageLcid],
    dtb.default_language_name AS [DefaultLanguageName],
    dtb.default_fulltext_language_lcid AS [DefaultFullTextLanguageLcid],
    ISNULL(dtb.default_fulltext_language_name,N'''') AS [DefaultFullTextLanguageName],
    CAST(dtb.is_nested_triggers_on AS bit) AS [NestedTriggersEnabled],
    CAST(dtb.is_transform_noise_words_on AS bit) AS [TransformNoiseWords],
    dtb.two_digit_year_cutoff AS [TwoDigitYearCutoff],
    dtb.target_recovery_time_in_seconds AS [TargetRecoveryTime],

              case
              when dtb.collation_name is null then 0x200
              else 0
              end |
              case
              when 1 = dtb.is_in_standby then 0x40
              else 0
              end |
              case dtb.state
              when 1 then 0x2
              when 2 then 0x8
              when 3 then 0x4
              when 4 then 0x10
              when 5 then 0x100
              when 6 then 0x20
              else 1
              end
             AS [Status],
    CAST(( case LOWER(convert( nvarchar(128), DATABASEPROPERTYEX(dtb.name, ''Updateability''))) when ''read_write'' then 1 else 0 end) AS bit) AS [IsUpdateable],
    CAST(dtb.is_encrypted AS bit) AS [EncryptionEnabled],
    CAST(dtb.is_honor_broker_priority_on AS bit) AS [HonorBrokerPriority],
    CAST(has_dbaccess(dtb.name) AS bit) AS [IsAccessible],
    ISNULL(fsopt.directory_name , N'''') AS [FilestreamDirectoryName],
    ISNULL(fsopt.non_transacted_access , 0) AS [FilestreamNonTransactedAccess],
    dtb.name AS [DatabaseName2],
    dtb.containment AS [ContainmentType2]
    FROM
    master.sys.databases AS dtb
    LEFT OUTER JOIN sys.database_mirroring AS dmi ON dmi.database_id = dtb.database_id
    LEFT OUTER JOIN sys.database_recovery_status AS drs ON drs.database_id = dtb.database_id
    LEFT OUTER JOIN sys.change_tracking_databases AS ctb ON ctb.database_id = dtb.database_id 
    LEFT OUTER JOIN sys.database_filestream_options AS fsopt ON fsopt.database_id = dtb.database_id
    WHERE
    (dtb.name=@_msparam_0)',N'@_msparam_0 nvarchar(4000)',@_msparam_0=N'testdb3'

搜索 "sys.database_recovery_status as drs"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接