2012-01-18 3 views
0

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

Каковы наилучшие методы использования данных здесь? Сохранять ли мои хранимые процедуры в «основной» базе данных и использовать динамический 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 [email protected] ' 
EXEC sp_executesql @sql, N'@UserID uniqueidentifier', @UserID 
END 

EXEC sp_executesql 'USE ' + @DataBase + '; GO' Я попытался затем запустить ОТБОРНОЕ, но я не мог получить эту работу.

ответ

0

Я понял. Это, вероятно, сделает SQL-экспертов безумными, но я доволен решением.

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

USE master 
EXEC sys.sp_MS_marksystemobject [sp_Users_SELECT] 
GO 

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

USE DataBase200 
EXEC sp_Users_SELECT 

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

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

1

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

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

+0

Я не владею базами данных и не обладаю способностью создавать новые. Это обрабатывается автономным приложением - я дополняю это мобильным сайтом. Я хочу воздержаться от внесения индивидуальных изменений в базу данных. На данный момент я пишу быстрый и грязный уровень данных и стараюсь быть осторожным, чтобы предотвратить атаки SQL-инъекций. –