Общая функция / хранимые процедуры для всех баз данных - PullRequest
1 голос
/ 02 февраля 2012

У нас есть сервер баз данных и около 10 баз данных.

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

Например, мы можем использовать sp_executesql в любой базе данных.

У нас есть такие требования (получение текущего учебного года, финансового года и т. Д.)

Это выполнимо? Благодаря.

Ответы [ 3 ]

3 голосов
/ 03 февраля 2012

Как и предполагали другие, вы можете поместить объекты в основную базу данных, но Microsoft явно рекомендует, чтобы вы не делали этого . Я нахожу это решение довольно рискованным в любом случае, потому что основная база данных «принадлежит» системе, а не вам, поэтому нет никаких гарантий, что она будет продолжать вести себя так же в будущем.

Вместо этого я считаю, что это в первую очередь проблема развертывания. Существует (как минимум) две стратегии, которые вы можете использовать:

  • Развертывание объектов в каждой базе данных
  • Развертывание их в одной «справочной» базе данных, которая используется только для общих объектов, и создание синонимов в других базах данных

Второй вариант, возможно, лучше, потому что, если ваши функции используют таблицы (например, вы используете таблицу календаря для получения учебного года, что намного проще, чем его вычисление), вам придется создавать одинаковые таблицы в каждом База данных тоже. Используя синонимы, вы должны поддерживать только один набор таблиц.

Для реального развертывания очень просто использовать сценарии для управления объектами, потому что вам просто нужен список баз данных для подключения и запуска каждого сценария DDL. Вы можете сделать это, используя пакетные файлы и SQLCMD (возможно, с переменными SQLCMD в ваших скриптах .sql), или использовать его из PowerShell или любого другого языка, который вы предпочитаете.

1 голос
/ 02 февраля 2012

В зависимости от того, что на самом деле делает SP, вы хотите создать процедуру в master, назвать ее sp_ и пометить как системную процедуру:

http://weblogs.sqlteam.com/mladenp/archive/2007/01/18/58287.aspx

0 голосов
/ 02 февраля 2012

Пара опций:

Вы можете использовать системную хранимую процедуру, как говорит Кейд.Я делал это в прошлом, и это работает хорошо.Одним из предупреждений по этому поводу является то, что процедура sp_MS_marksystemobject недокументирована, что может означать, что она может исчезнуть или измениться без предупреждения в будущих версиях SQL.Оглядываясь назад, я думаю, что при использовании этого подхода с функциями были и другие проблемы.

Другой подход заключается в использовании стандартизированных процедур и функций и развертывании их по всем базам данных с использованием sp_MSforeachdb для запуска кода для каждой базы данных.Если вам нужно работать только с вашей 10 базой данных, вы можете скопировать код в этой процедуре и изменить его, чтобы убедиться, что база данных соответствует вашей схеме, прежде чем запускать код (или вы можете написать свою собственную версию, которая делает подобное).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...