Использование одного набора хранимых процедур для сотен идентичных баз данных - PullRequest
0 голосов
/ 18 января 2012

Я унаследовал проект, в котором каждый «клиент» имеет свою собственную базу данных.Есть сотни баз данных.Хранимые процедуры в настоящее время не используются.

Каковы оптимальные методы использования данных здесь?Сохраняю ли я свои хранимые процедуры в «главной» базе данных и использую динамический SQL для сброса данных?Кажется, должен быть намного лучший путь.Я не хочу, чтобы выполнялось задание по переносу хранимых процедур вокруг сотен БД, чтобы синхронизировать все хранимые процедуры.

Этот динамический SQL работает, но мне нужен лучший способ.

CREATE PROCEDURE [Users_SELECT] 
@DataBase nvarchar(20),
@UserID uniqueidentifier
AS
BEGIN
DECLARE @sql nvarchar(max)
SET @sql = ''
SET @sql += 'SELECT * FROM ' + @DataBase + '.dbo.Users u '
SET @sql += 'WHERE u.UserID=@UserID '
EXEC sp_executesql @sql, N'@UserID uniqueidentifier', @UserID
END

Я попытался EXEC sp_executesql 'USE ' + @DataBase + '; GO', затем запустил SELECT, но я не смог заставить это работать.

Ответы [ 2 ]

1 голос
/ 18 января 2012

Я не вижу, что не так с развертыванием хранимых процедур в каждой базе данных.

Вам также необходимо развернуть изменения в схеме, поэтому, надеюсь, у вас есть инфраструктура, чтобы сделать это автоматически.Если нет, то пришло время построить эту инфраструктуру.

0 голосов
/ 31 января 2012

Я понял это. Возможно, это сильно рассердит экспертов по SQL, но я доволен решением.

Я создал свои хранимые процедуры в 'master'. Я знаю, что это обычно нет-нет. Я тогда использовал

USE master
EXEC sys.sp_MS_marksystemobject [sp_Users_SELECT]
GO

чтобы пометить каждого спрока как системный объект. Таким образом, они могут быть вызваны в другом контексте. Затем я могу сделать это:

USE DataBase200
EXEC sp_Users_SELECT

и он будет работать в контексте базы данных DataBase200, без необходимости развертывания sproc в этой базе данных. Пока все работает отлично. Помните, что для того, чтобы они были распознаны как системные объекты, вам необходимо добавить префикс к именам хранимых процедур sp_.

Надеюсь, это кому-нибудь поможет.

...