Можно ли запросить @@ DBTS для базы данных, отличной от текущей базы данных? - PullRequest
1 голос
/ 05 ноября 2008

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

<br/>USE ExternalDB <br/>GO <br/> <br/>SELECT @myVarbinary8 = @@DBTS <br/>GO <br/> <br/>USE OriginalDB <br/>GO

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

Пока что я встроил скалярную функцию в исходную базу данных для вызова

SET @Result = SELECT @@ DBTS

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

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

SELECT ExternalServer.dbo.@@DBTS

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



См. MSDN @@ документация DBTS

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

Ответы [ 3 ]

1 голос
/ 06 ноября 2008

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

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

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

EXECUTE ExternalDB.dbo.GetDatabaseTimestamp;
1 голос
/ 05 ноября 2008

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

0 голосов
/ 06 ноября 2008

Спасибо за информацию, Младен, этот совет полезно знать:)

Но в то время как это помогает мне вызывать функцию, находящуюся в master в текущем контексте базы данных "ContextCurrent", я действительно хочу иметь возможность вызывать скалярную функцию из контекста исходной базы данных "ContextSource".

Хотя в целом у меня есть резервирование для динамического sql, я использовал его здесь следующим образом.

<br/>DECLARE @sourceDbName nvarchar(128) <br/>SET @sourceDbName = N'sbaportia1' <br/> <br/>DECLARE @strQuery nvarchar(max) <br/>DECLARE @parmDefn nvarchar(max) <br/>DECLARE @DbtsCapture varbinary(8) <br/>SET @strQuery = <br/> ' <br/> N' ' + N'USE' + N' ' + @sourceDbName + N' ' <br/> + N' ' + N'SELECT @dbtsCapture = min_active_rowversion()' <br/> ' <br/> <br/>SET @parmDefn = <br/> N' <br/> @dbName varchar(128), <br/> @dbtsCapture varbinary(8) OUTPUT <br/> ' <br/> <br/>EXEC sp_executesql @strQuery <br/> ,@parmDefn <br/> ,@dbName = 'autobahn' <br/> ,@dbtsCapture = @dbtsCapture OUTPUT <br/> <br/>SELECT @dbtsCapture

Кроме того, поскольку sp_executesql работает в отдельном потоке, контекст базы данных в скрипте ниже будет автоматически будет таким же при выходе из sp_executesql как при входе в sp_executesql. (Я слишком много узнал о sp_executesql в начале 2000-х годов.)

...