【问题标题】:Is it possible to query the @@DBTS on a database other than the current database?是否可以在当前数据库以外的数据库上查询@@DBTS?
【发布时间】:2008-11-05 19:49:08
【问题描述】:

对于源数据库状态的严格标记,我想捕获@@DBTS 存储过程中的外部数据库。是的,我想我可以发出


USE ExternalDB
GO

SELECT @myVarbinary8 = @@DBTS
GO

USE OriginalDB
GO

但是,即使我可以,它看起来也很丑。

目前,我在源数据库中嵌入了一个标量值函数来调用

SET @Result = SELECT @@DBTS

在我忘记要求 DBA 为新用户授予适当权限之前一直很好,这导致进程崩溃。

类似于

SELECT ExternalServer.dbo.@@DBTS

(我知道那行不通)。



MSDN @@DBTS documentation

@@DBTS (Transact-SQL)
返回当前数据库的当前时间戳数据类型的值。
保证此时间戳​​在数据库中是唯一的。

【问题讨论】:

    标签: database sql-server-2005 tsql timestamp


    【解决方案1】:

    一种方法是将标量函数放入主数据库并将其标记为系统对象。这样它在当前数据库的上下文中被调用 请参阅此处了解更多信息: http://weblogs.sqlteam.com/mladenp/archive/2007/01/18/58287.aspx

    【讨论】:

      【解决方案2】:

      在你的“其他”数据库中创建一个存储过程:

      CREATE PROCEDURE dbo.GetDatabaseTimestamp AS
         SET NOCOUNT ON;
         SELECT @@DBTS AS CurrentRowversion, MIN_ACTIVE_ROWVERSION() AS ActiveRowversion
      

      然后你可以从你当前的数据库调用:

      EXECUTE ExternalDB.dbo.GetDatabaseTimestamp;
      

      【讨论】:

      • 只是一种风格/实践的东西...我大脑的函数式编程方面喜欢远离不必要的副作用(使用 USE 更改数据库上下文)。至少 w/ sp_executesql,上下文保证是原始的,不需要切换回来
      【解决方案3】:

      感谢 Mladen 提供的信息,很高兴知道这个提示 :)

      虽然这有助于我从当前数据库上下文“ContextCurrent”中调用驻留在 master 中的函数,但我真正想要的是能够从源数据库“ContextSource”的上下文中调用标量值函数。

      虽然总的来说,我对动态 sql 有所保留,但我最终在这里使用它如下。


      DECLARE @sourceDbName nvarchar(128)
      SET     @sourceDbName = N'sbaportia1'

      DECLARE @strQuery nvarchar(max)
      DECLARE @parmDefn nvarchar(max)
      DECLARE @DbtsCapture varbinary(8)
      SET    @strQuery =
         '
                N' ' + N'USE' + N' ' + @sourceDbName + N' '
              + N' ' + N'SELECT @dbtsCapture = min_active_rowversion()'
         '

      SET @parmDefn =
         N'
              @dbName varchar(128),
              @dbtsCapture varbinary(8) OUTPUT
         '

      EXEC sp_executesql  @strQuery
                         ,@parmDefn
                         ,@dbName = 'autobahn'
                         ,@dbtsCapture = @dbtsCapture OUTPUT

      SELECT @dbtsCapture

      此外,由于 sp_executesql 在单独的线程中运行, 下面脚本中的数据库上下文将是 sp_executesql 退出时自动相同 与 sp_executesql 的条目一样。 (我在 2000 年代初期对 sp_executesql 了解得太多了。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-08
        • 2018-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多