Поскольку у SQL Server нет пакетов, что делают программисты, чтобы обойти это?

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

Что делают программисты, чтобы обойти отсутствие "пакетной" функции, подобной функции Oracle?

Ответы

Ответ 1

В то время как SQL Server не имеет ничего общего с "классными функциями" инкапсуляции и состояния пакета , как вы привыкли к, вы можете упорядочить хранимые процедуры в схемах.

В менеджере предприятия эти procs все еще перечислены вместе, что делает для HUGE treelist, если у вас есть сотни procs. Я тоже скучаю по организации и классным функциям пакетов Oracle. Однако все платформы имеют свои сильные стороны.

ПРИМЕЧАНИЕ. Написание хранимых процедур на языке .NET дает вам инкапсуляцию и состояние. Однако он по-прежнему не разделяет их в дереве EM каким-либо особым образом.

Ответ 2

Придумайте хорошее соглашение об именах, используйте его и принудительно выполните его.

Ответ 3

Схемы могут использоваться для организации хранимых процедур и других объектов. Лично я предпочитаю использовать схемы, когда они организуют объекты по функциональной области, и где эти функциональные области соответствуют границам безопасности. Пример этого можно найти в базе данных примеров AdventureWorks, которая имеет схемы, такие как "HumanResources" и "Sales". Теория состоит в том, что данный пользователь может нуждаться в доступе к объектам в "HumanResources", но может не нуждаться в доступе к информации "Продажи".

Альтернативой является использование соглашения об именах и обеспечение его соблюдения, как говорит Джеймс выше. Я добавлю, что в SQL Server Management Studio есть кнопка фильтра, которая может использоваться для фильтрации списка отображаемых объектов. Например, можно щелкнуть по папке "Хранимые процедуры" и фильтровать по имени "Добавить".

В моем текущем проекте я вытащил несколько SQL-запросов из пакетов SSIS и в хранимые процедуры. Чтобы различать эти хранимые процедуры и те, которые должны быть общего использования, я префиксировал имена с помощью "ssis". Было бы, конечно, приятнее, если бы я мог создать нечто похожее на пространство имен на С# или С++ и создать "SSIS.SelectUserLookupData" вместо "ssis_SelectUserLookupData". Было бы даже лучше, если бы эти пространства имен были вложены.

Если это одна из задач Packages в Oracle, тогда, возможно, кто-то даст мне знать.

Ответ 4

Я работал как с SQL Server, так и с Oracle, поэтому видел и то, и другое. Поскольку приведенные выше комментарии были немного нагреты, я попытаюсь сохранить это как можно нейтральнее...

Итак, что такое пакет Oracle? Подумайте об этом как о классе базы данных

Пакет имеет два элемента: заголовочный файл и файл body. Заголовочный файл является вашим общедоступным интерфейсом и содержит подпись (имя, параметры и тип возвращаемого значения, если применимо) всех хранимых процедур или функций (в Oracle функция возвращает значение, а хранимая процедура не является), которые могут быть напрямую вызваны. Тело пакета должно реализовать все сигнатуры процедуры в файле заголовка пакета.

Элемент body пакета содержит все хранимые процедуры и логику, которые фактически выполняют работу. У вас может быть процедура сохранения, объявленная в заголовке пакета, которая вызывает вставку или обновление proc, которые существуют в теле. Разработчик может видеть только процесс "Сохранить". Важно иметь в виду, что тело пакета может также выполнять procs или функции, не объявленные в заголовке пакета, они просто недоступны вне самого пакета.

Я нашел пакеты действительно полезными по нескольким причинам:

  • У вас есть концепция открытого интерфейса, которая может быть предоставлена ​​другим разработчикам.
  • Пакеты могут отражать ваши скомпилированные классы. Мой метод Orders.Save() С# вызовет мой метод Oracle Orders.SaveLineItem для сохранения каждой позиции и метода Oracle SaveOrder, чтобы сохранить подробные сведения о заказе.
  • Мои procs сгруппированы в логичном порядке в пакетах

Лично я буду любить MS, чтобы реализовать какую-то функциональность пакета, поскольку я думаю, что он делает более чистую базу данных.

Ответ 5

1) Как и люди, Schema является более логичным и ANSI-совместимым способом организации таблиц и процедур базы данных.

2) Наилучшая практика разработки программного обеспечения заключается в том, что мы никогда не должны делать изменения непосредственно на любом сервере. Поскольку все sprocs базы данных написаны сценарием и находятся под контролем конфигурации, мы можем организовать эти сценарии в любую структуру папок, которую мы хотим.

3). Лучший аргумент против пакетов oracle - это то, что на основе опыта и исследований на сайте Ask Tom невозможно обновить пакет, не снимая его. Это неприемлемо. С SQL Server мы можем обновлять хранимые процедуры "на лету", не прерывая производственную работу.

Обновление: WeMartin, вы говорите: "В реальной производственной среде изменения никогда не должны тестироваться в процессе производства. Обновления должны быть перенесены из тестовой среды в производство по расписанию и упорядоченно. В системе 24/7, затем избыточную рабочая среда должна обрабатывать время простоя при обновлении серверов".

Я вовсе не подразумеваю, что ЛЮБЫЕ изменения проверяются на производстве. Даже если изменения будут протестированы в 9 более низких средах разработки, эти полностью и тщательно протестированные изменения должны быть развернуты на производственном сервере. В этот момент, используя пакеты Oracle, производственный сервер должен быть сбит во всех случаях, даже для небольших изменений sproc.

Ответ 6

3). Лучший аргумент против пакетов oracle - это то, что на основе опыта и исследований на сайте Ask Tom невозможно обновить пакет, не снимая его. Это неприемлемо. С SQL Server мы можем обновлять хранимые процедуры "на лету", не прерывая производственную работу.

Я понимаю разочарование этого утверждения, но я бы не назвал id "неприемлемым". В настоящей производственной среде изменения никогда не должны проверяться в процессе производства. Обновления должны перемещаться из тестовой среды в производство по расписанию и упорядоченно. В системе 24/7 тогда избыточная производственная среда должна обрабатывать время простоя при обновлении серверов. Мало того, что пакет должен быть снят с линии, но новый пакет, если он не скомпилирован, сработает, если он будет снова включен. Для баз данных Oracle требуется элемент DBA. Однако я пропускаю пакеты Oracle.

Ответ 7

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

Ответ 8

Я хотел бы поблагодарить моих счастливых звезд, что SQL Server не имеет пакетов. Пакеты Oracle сосут.

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

Пока MS никогда не реализует такие пакеты, как Oracle, это будет победой в моей книге.

EDIT для комментаторов:

Oracle Packages - это просто способ организовать ваши хранимые процедуры, в том числе, пакеты, чтобы у вас не было 100 хранимых процедур, а возможно 5 пакетов. Они не складываются, как пакеты в Java или С#. Все пакеты находятся на одном уровне.

Пакет требует наличия двух файлов: файла заголовков и файла body. Это создает разочарование при добавлении новых процедур в существующий пакет, потому что вы не можете добавить тело без добавления заголовка, хотя он содержит ту же информацию, что и в теле.

Например, вот фрагмент из файла заголовка одного из моих пакетов:

    PROCEDURE bulk_approve_events
(
    i_last_updated_by IN VARCHAR2,
    o_event OUT NUMBER
);

И вот соответствующая процедура в теле:

    PROCEDURE bulk_approve_events
(
    i_last_updated_by IN VARCHAR2,
    o_event OUT NUMBER
) IS
...
BEGIN
...
END;

Никакой разницы. Файл заголовка бесполезен и является просто еще одним препятствием для разработчика при разработке с пакетами. В моем проекте у нас есть соглашение, согласно которому вся прокомментированная документация для каждой процедуры содержится в заголовке, а также сведения о том, когда она была добавлена ​​и кем, но это можно было бы легко включить в тело.