Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
march98
Member

Откуда:
Сообщений: 7
Суть задачи в следующем:
Есть несколько баз-хранилищ данных (с одинаковой структурой) и есть некая единая бизнес-логика, лежащая в отдельной БД.
Требуется вызывать процедуры из единой БД, но так, чтобы при каждом обращении велась работа с конкретной БД-хранилищем.

Явно указывать префикс перед таблицей в текст процедуры нельзя, так как каждый раз БД будет разная.
Использовать динамический SQL очень не хочется - слишком много ограничений и при частых вызовах - явное падение производительности.

Собственно задача сводится к тому, чтобы вызвать процедуру из единой БД в контексте конкретной БД-хранилища.
Какие будут идеи?

Заранее благодарен.
11 май 12, 13:29    [12535941]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
declare @ProcName sysname;

select
 @ProcName = N'DB1.dbo.MyProc';

exec @ProcName;
11 май 12, 13:34    [12536008]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
march98
Member

Откуда:
Сообщений: 7
invm,

Спасибо, но и в этом случае из процедуры DB1.dbo.MyProc не видны таблицы текущей БД :(
11 май 12, 13:36    [12536036]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
Glory
Member

Откуда:
Сообщений: 104751
march98
Спасибо, но и в этом случае из процедуры DB1.dbo.MyProc не видны таблицы текущей БД

Почему вдруг они не видны ?
11 май 12, 13:39    [12536057]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
march98
Member

Откуда:
Сообщений: 7
Glory,

Как я понимаю - из-за отсутствия префикса БД у таблицы.

Вот текст процедуры :
USE DB1
GO

ALTER PROCEDURE [dbo].[my_proc]
-- Add the parameters for the stored procedure here
AS
BEGIN
SELECT * FROM dbo.[Table_1]
END
GO

В DB1 нет таблицы Table1, но она есть в DB2.
Но при выполнении скрипта

USE DB2
GO
declare @ProcName sysname;

select
@ProcName = N'[TEST_sp].[dbo].[my_proc]';

exec @ProcName;

Получаю ошибку:
Недопустимое имя объекта "dbo.Table_1".

Если в тексте процедуры указать явно префикс
SELECT * FROM DB2.dbo.[Table_1]
, то все выполняется, следовательно с правами все ОК
11 май 12, 13:45    [12536107]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Работать в конексте текущей базы могут только системные процедуры, находящиеся в базе master
11 май 12, 13:51    [12536167]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
синонимы?
11 май 12, 13:52    [12536182]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
march98
Member

Откуда:
Сообщений: 7
Glory,

Подскажи, плз, как должен выглядеть скрипт создания процедуры?

Выполнение скрипта
===========
USE master
GO
CREATE PROCEDURE [sp_my_proc]
-- Add the parameters for the stored procedure here
AS
BEGIN
SELECT * FROM dbo.[Table_1]
END
============
и вызов

============
USE DB2
exec sp_my_proc
============
проблемы не решило - все равно ошибка 'Недопустимое имя объекта "dbo.Table_1".'
11 май 12, 14:04    [12536321]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
march98
Member

Откуда:
Сообщений: 7
HandKot,

Синонимы тоже проблемы не решают :(
11 май 12, 14:04    [12536330]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
Glory
Member

Откуда:
Сообщений: 104751
march98
проблемы не решило - все равно ошибка 'Недопустимое имя объекта "dbo.Table_1".'

Потому что ваша процедура - пользовательская, а не систмемная
11 май 12, 14:05    [12536343]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
march98
Member

Откуда:
Сообщений: 7
Glory,

А как сделать ее системной?
11 май 12, 14:06    [12536346]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
march98
Member

Откуда:
Сообщений: 7
Glory,

Погуглив, понял свою ошибку. Привожу полный текст скрипта (может кому пригодится)

===========
USE master
GO
CREATE PROCEDURE [sp_my_proc]
-- Add the parameters for the stored procedure here
AS
BEGIN
SELECT * FROM dbo.[Table_1]
END
GO

exec sp_MS_marksystemobject '[sp_my_proc]'
============
После этого добился того, чего и хотелось.
Спасибо огромное!
11 май 12, 14:28    [12536589]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться из процедуры базы DB1 к таблице в DB2, но без использования явного префикса  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
march98,

Вам бы архитектуру пересмотреть, а не делать костыли в виде системных процедур.
11 май 12, 14:29    [12536601]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить