У меня есть несколько различных баз данных на одном SQL Server 2008 R2. Для аргументов давайте назовем их DB_A, DB_B и DB_C. Меня попросили разработать как хранимую процедуру, которая будет работать на DB_A. Этот сохраненный proc будет использоваться для удаления и создания индексов, а также для хранения дополнительной информации об индексе в таблице на DB_A. Когда этот хранимый proc вызывается из DB_C или DB_C, он сможет отбрасывать и создавать индексы в вызывающей базе данных, но хранить дополнительную информацию об индексе в таблице на DB_A.Как вернуть имя удаленной базы данных, которое вызывает хранимую процедуру в другой базе данных?
Вот что я хотел бы сделать: я хотел бы, чтобы хранимая процедура имела возможность получить имя вызывающей базы данных БЕЗ необходимости запрашивать имя базы данных в качестве параметра.
Вот простой пример:
USE [DB_A]
CREATE PROC sp_WhatDatabaseAmICallingFrom
AS
BEGIN
DECLARE @calling_db NVARCHAR(128)
SET @calling_db = DB_NAME()
PRINT 'calling database: ' + @calling_db
END
Когда я выполнить хранимую процедуру в DB_A ...
EXEC sp_WhatDatabaseAmICallingFrom
... он возвращает: "призывающие базы данных: DB_A"
Когда я выполняю хранимую процедуру в DB_B ...
USE DB_B
GO
EXEC DB_A.dbo.sp_WhatDatabaseAmICallingFrom
... он возвращает: «вызов базы данных: DB_A».
После ознакомления с различными функциями метаданных SQL Server это именно то, что он должен делать. Но я хотел бы изменить код так, чтобы он задавал @calling_db имя вызывающей базы данных, так что мой пример хранимой процедуры будет печатать: «вызывающая база данных: DB_B».
К сожалению, я не могу найти никаких функций метаданных, которые могут это сделать. Любые идеи о том, как это можно сделать?
Очень интересный вопрос.Из любопытства есть причина, по которой вы не хотите, чтобы процесс, вызывающий sproc, указывал dbname как параметр (кроме необходимости поддерживать параметр и предоставлять его)? Одна мысль, если нет прямого способа сделать это, заключается в том, чтобы сделать параметр необязательным @CallingDB NVARCHAR (128) = NULL и проверить, имеет ли значение значение null. Если это так, по умолчанию используется DB_NAME(). Конечно, это означает, что вызов из других баз данных должен будет содержать имя ... –
Единственная реальная причина, по которой я не хочу использовать параметр, я думаю, что должен быть способ сделать это, и я ненавижу ходить прочь от такой задачи, не найдя решения. –
FYI, тот же вопрос был [задан на сайте DBA] (http://dba.stackexchange.com/questions/30310/db-id-context-from-farther-up-call-stack), хотя он hasn ' ответили. Предложенные предложения состояли в том, чтобы использовать расширенные события, SQL CLR или поддерживать собственный стек вызовов, используя ['CONTEXT_INFO'] (http://msdn.microsoft.com/en-us/library/ms187768.aspx). – Pondlife