Являются ли хранимые процедуры хорошей идеей, когда сервер не находится под вашим контролем?

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

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

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

Это обоснованное беспокойство?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
215
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Можно зашифровать хранимые процедуры с помощью подсказки С ШИФРОВАНИЕМ - есть минусы, такие как хранимая процедура, которую чрезвычайно трудно расшифровать.

Другой вариант - использовать инструмент ORM (или аналогичный), который динамически генерирует код SQL, например. Linq для SQL / Entities, NHibernate и т. д.

Или вы можете просто убедиться, что клиент знает, что система больше не будет поддерживаться, если какие-либо изменения были сделаны на уровне БД - это может быть достаточным стимулом для них не вмешиваться.

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

Alex J 26.12.2008 17:36

"Это обоснованное беспокойство?"

Да. Хранимые процедуры - это кошмар обслуживания даже на локально управляемом сервере.

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

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

Он создает целенаправленные транзакции, улучшающие производительность. Это также можно сделать в вашем приложении.

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

Любые изменения означают, что вы исправите это, но на их копейке, а не на вашей, поскольку они вызвали проблему.

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

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

annakata 19.12.2008 18:54

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

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

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

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

Это случалось нечасто. Просто дело в том, что если они могут, они сделают это, и они это сделали.

Alex J 19.12.2008 18:06

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

Я не голосовал против вас, но полагаю, это потому, что ваш ответ на самом деле не затрагивает ни одну из проблем, поднятых в вопросе.

Paul Nearney 19.12.2008 18:42

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

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

Я согласен с вышеупомянутым Pax в том, что с этим лучше всего справиться через контакт; если клиент ломает базу данных из-за "возни", ему придется потом заплатить за исправление.

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

Если вы дадите им права администратора (общие), вы мало что сможете сделать, чтобы их остановить. Тем не менее, есть несколько отличных инструментов, таких как RedGate SQL Compare, которые позволяют сравнивать 2 схемы базы данных (например, снимок того, что должно быть по сравнению с тем, что есть сейчас), и он мгновенно сообщит вам, есть ли какие-либо изменения, и что они.

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

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

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

Другие вопросы по теме