2008-11-05 2 views
1

Для строгого маркера состояния исходной базы данных я хотел бы захватить @@ DBTS внешней базы данных в sproc. Да, я думаю, что я мог бы выпуститьМожно ли запросить @@ DBTS в базе данных, отличной от текущей базы данных?


USE ExternalDB
GO

SELECT @myVarbinary8 = @@DBTS
GO

USE OriginalDB
GO

, но, даже если бы я мог, это кажется отвратительным.

На данный момент, я встроил скалярные функции в исходной базе данных для вызова

SET @result = SELECT @@ DBTS

, который работал хорошо, пока я не забыл спросить АБД предоставить соответствующие права новому пользователю, который разбил процесс.

Что-то похожее на

SELECT [email protected]@DBTS

(я знаю, что не работает).



См   MSDN @@DBTS documentation

@@ DBTS (Transact-SQL)
возвращает значение текущего типа временной метки данных для текущей базы данных.
Эта метка времени будет уникальной в базе данных.

ответ

1

Один из способов - поместить эту скалярную функцию в основную базу данных и пометить ее как системный объект. таким образом она вызывается в контексте текущей базы данных смотрите здесь для получения дополнительной информации: http://weblogs.sqlteam.com/mladenp/archive/2007/01/18/58287.aspx

0

Спасибо за информацию, Младен, что наконечник хорошо знать :)

Но в то время, что помогает мне вызов функция, находящаяся в главном из текущего контекста базы данных «ContextCurrent», я действительно хочу иметь возможность вызывать скалярнозначную функцию из контекста исходной базы данных «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. (я узнал waaayy слишком много о sp_executesql в начале 2000-х годов.)

1

Создание хранимой процедуры в вашем «другой» базы данных :

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

, а затем из текущей базы данных вы можете позвонить:

EXECUTE ExternalDB.dbo.GetDatabaseTimestamp; 
+0

Просто стиль/практика ... Функциональная часть программирования моего мозга любит держаться подальше от ненужных побочных эффектов (изменение контекста базы данных с использованием USE). Как минимум w/sp_executesql, контекст гарантированно будет оригинальным без необходимости его возврата – 2008-11-06 12:41:33

 Смежные вопросы

  • Нет связанных вопросов^_^