Сколько приложений вашей базы данных должно быть в хранимых процедурах? - PullRequest
4 голосов
/ 10 июня 2009

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

Должны ли приложения разрабатываться таким образом? Сколько приложений базы данных должно быть в хранимых процедурах?

Ответы [ 8 ]

6 голосов
/ 10 июня 2009

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

Что касается других вещей, таких как бухгалтерский учет, контрольные журналы и т. Д., Мы также помещаем их в хранимые процедуры. Триггеры удобны, но мы обнаружили, что для целей журналов аудита, включающих информацию о том, кто, что и когда обновляет, не все данные, которые мы хотим, доступны для триггера. Единственный раз, когда мы использовали триггеры, это ведение полной истории изменений каждой записи в таблице, но даже тогда, оглядываясь назад, это вызывало проблемы с обслуживанием, и sproc был бы для нас лучше.

5 голосов
/ 10 июня 2009

Это полностью зависит от вашей среды. Ответ на этот вопрос на самом деле не проблема кодирования или даже проблема анализа, а бизнес-решение.

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

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

  1. С корпоративной базой данных актив является ценным, и неверные данные или действия могут иметь опасные для бизнеса последствия. Ваша главная задача - защитить бизнес, а не то, насколько удобный доступ для ваших кодировщиков.
  2. Такие базы данных по определению доступны более чем одному приложению. Вам необходимо использовать абстракцию, предлагаемую хранимыми процедурами, чтобы база данных могла быть изменена при обновлении приложения A, и у вас нет ресурса для обновления приложения B.
  3. Аналогичным образом, инкапсуляция бизнес-логики в SP, а не в коде приложения, позволяет вносить изменения в такую ​​логику в рамках бизнеса проще и надежнее, чем если бы такая логика была встроена в код приложения. Например, если расчет налога изменяется, он менее трудоемок и более надежен, если расчет необходимо изменить в одном SP, а не в нескольких приложениях. Основное правило здесь заключается в том, что бизнес-правило должно быть реализовано в самой близкой точке к данным, где оно уникально - поэтому, если у вас есть специализированное приложение, тогда логика для этого приложения может быть реализована в этом приложении, но логика более широко применима. чтобы бизнес был реализован в СП.

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

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

3 голосов
/ 10 июня 2009

Мошенничество гораздо проще зафиксировать в базе данных, которая имеет динамический sql, поступающий из приложения, поскольку разрешения устанавливаются на уровне таблицы. Большинство мошенничества совершают нынешние сотрудники, которые часто имеют легкий доступ к серверу. Также недовольные сотрудники любят делать что-то для уничтожения данных. Ровно два человека должны иметь доступ к таблицам в вашей производственной базе данных, если в ней есть какие-либо финансовые данные, это dba и один альтернативный dba. У всех остальных должны быть только те задачи, которые описаны с использованием сохраненных процедур и ничего больше. Аудит должен быть на уровне базы данных, или он по сути бесполезен. Если я выполняю аудит на уровне приложения в приложении, которое не использует хранимые процессы (эти два обычно выполняются вместе), легко кому-то получить прямой доступ к таблицам, изменить что-либо и затем не отслеживать. Журналы аудита предназначены для отслеживания изменений в данных, которые могут быть полностью выполнены только в том месте, где данные изменяются.

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

Другая причина использования procs заключается в том, что при необходимости гораздо проще выполнить реорганизацию базы данных, если все вызовы таблицы заключены в procs. Также намного легче загружать небольшие изменения в продукт.

3 голосов
/ 10 июня 2009

Как правило, я предпочитаю хранить как можно больше данных в SP; полуобобщенный уровень доступа к данным будет обрабатывать запросы и представлять данные интерфейсу.

Старая мудрость «повышения производительности» с SP больше не актуальна *, но я обнаружил, что обслуживание с этим методом намного проще

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

<ч /> * Общепринято считать, что хранимые процедуры работают лучше, чем специальные SQL-запросы. Однако это неверно:

SQL Server 2000 и версия SQL Server 7.0 включают ряд изменений в обработку выписок, которые расширяют многие из преимуществ производительности хранится процедуры для всех операторов SQL. SQL Server 2000 и SQL Server 7.0 не сохранить частично составленный план для хранимые процедуры, когда они создано. Хранимая процедура компилируется во время выполнения, как и любой другой оператор Transact-SQL. SQL Server 2000 и SQL Server 7.0 сохраняют планы выполнения для всех операторов SQL в кеше процедур, а не только планы выполнения хранимых процедур.

- SqlServer's Books Online

2 голосов
/ 10 июня 2009

Все должно быть на своем месте.

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

Рано или поздно кто-то собирается подключиться к нему с ошибочным приложением или с ошибочной клиентской библиотекой (у Oracle есть некоторые клиенты, которые позволяют пользователям создавать недопустимые даты). Или они собираются связаться с автором отчетов или Access или Excel.

Я предпочитаю не разрешать прямой доступ к таблицам, а разрешать только доступ к представлениям, SP и т. Д., Так что здесь разрешается управление разрешениями на основе ролей, и контракт интерфейса формируется очень похоже на способ определения интерфейсов для ваших классов. или услуги на прикладном уровне. Это не означает, что вся / большая логика приложения находится в хранимых процедурах, но это означает, что база данных обеспечивает соблюдение определенных правил - обычно основных, таких как ссылочная целостность - так что приложение CAN делает некоторые предположения о том, как База данных использовалась в прошлом предыдущими версиями себя безопасно.

На Tech Ed 2009 состоялось отличное групповое обсуждение, которое вы можете посмотреть здесь .

1 голос
/ 10 июня 2009

Вот другая точка зрения: Нет .

База данных предназначена для постоянных данных.

Ваша заявка на обработку. Вся логика, весь код, все решения, все вычисления, вся ссылочная целостность - все должно быть в вашем приложении.

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

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

Все остальное там не принадлежит.

Люди поднимают "проблемы", подобные следующим.

  1. База данных "центральная". Каким-то образом сервер приложений не является центральным. Я не понимаю Если вы хотите централизованную обработку, используйте сервер приложений. Если вы хотите много сложной, централизованной обработки, используйте ESB.

  2. Некоторая обработка "ближе к базе данных". Есть много плохих примеров. Хорошие примеры часто связаны с назначением суррогатных ключей. Я предпочитаю использовать слой ORM (iBatis, или SQLAlchemy или что-то), чтобы сделать это. Вы получаете тот же эффект без написания или поддержки хранимой процедуры.

  3. Некоторая обработка требует аудита. На самом деле, вся обработка требует аудита. Используйте объекты Business Domain с ORM и выполняйте обработку аудита в своем приложении.

    Хороший встроенный аудит на основе СУБД. Любой аудит, который вы пишете с помощью хранимых процедур, не будет таким хорошим Решение - используйте ведение журнала в вашем приложении и встроенные функции аудита ядра базы данных. Избегайте триггеров и SP для этого.

  4. Хранимые процедуры выполняются быстрее. Это неправда. Хороший дизайн транзакций делает вещи быстрее. Хранимые процедуры накладывают ряд ограничений на вашу архитектуру, что иногда вынуждает вас создавать небольшие аккуратные транзакции. Попробуйте написать ту же небольшую целенаправленную транзакцию на Java, и вы обнаружите, что PL / SQL на самом деле не быстрее.

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

* * Пример тысячи сорок один * ** 1 043 тысяча сорок-дв *

«если я создам новые записи, ожидаемые записи журнала аудита не будут созданы»

Если у вас было правильное определение класса Business Domain для создания ваших записей, оно также создало бы записи аудита для вас в вашем приложении.

1 голос
/ 10 июня 2009

Разные философии имеют разные ответы, но вот мое

  1. Вычисления с интенсивным использованием данных - в частности, все, что очень дорого делать за пределами базы данных.

  2. Общий код. Моей последней работой, в которой использовалась реляционная база данных, было подключение к библиотеке функций базы данных. Код Java ничего не знал об этой связи. Чтобы избежать дублирования, любые функции, необходимые как коду, обращающемуся к библиотеке, так и используемому Java, были хранимыми процедурами.

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

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

1 голос
/ 10 июня 2009

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

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

Забывая пример слабости: когда вы можете разделить проблемы без ущерба для дизайна и целостности вашей системы ... сделайте абстракцию и сделайте это!

Финансовый сектор использует множество SP для создания эффективного API поверх базы данных для обработки простых финансовых операций, поскольку они могут встроить аудит за пределами применение в хранимых процедурах.

В типичном дизайне то, что должно быть на стороне СУБД и на стороне приложения, может быть совершенно очевидно, когда вы думаете ... 'Нужно ли приложению делать это с данными, это заботится ??'

...