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

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

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

Ответы [ 8 ]

23 голосов
/ 21 апреля 2009

Хотя SQL Server ничего не может предложить в виде «интересных функций» инкапсуляции и состояния пакета , как вы привыкли к , вы можете организовать свои хранимые процедуры в схемы.

В менеджере предприятия все эти прокы все еще перечислены вместе, что делает ОГРОМНЫЙ тройник, если у вас есть сотни проков. Мне тоже не хватает организации и интересных функций пакетов Oracle. Тем не менее, все платформы имеют свои сильные стороны.

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

14 голосов
/ 21 апреля 2009

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

8 голосов
/ 21 апреля 2009

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

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

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

Если это одна из особенностей Пакетов в Oracle, то, возможно, кто-то сообщит мне.

5 голосов
/ 07 августа 2009

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

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

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

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

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

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

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

1 голос
/ 21 августа 2013

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

1 голос
/ 03 января 2013

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

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

1 голос
/ 09 марта 2012

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

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

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

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

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

0 голосов
/ 22 апреля 2009

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

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

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

РЕДАКТИРОВАТЬ для комментаторов:

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

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

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

    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;

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

...