Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вся логика - на ХП?  [new]
trayal
Member

Откуда: Пенза
Сообщений: 471
Здравствуйте!

Я часто встречал на форуме информацию о том, что всю логику можно (нужно) делать на ХП. Но тогда, IMHO, появляются некоторые минусы при работе клиента с БД.

1) Пусть есть процедура, удаляющая запись из таблицы по передаваемому ID (и, возможно, производящая еще какие-то действия).
Тогда получается, что удалить несколько записей одной транзакцией невозможно? На клиенте надо организовывать цикл, вызывающий эту ХП?
Аналогично со вставкой / изменением.

2) Выборка записей через ХП. IMHO, трудно (а иногда и невозможно) предусмотреть все возможные параметры отбора записей, варианты сортировки и т.п. Как же быть?

Как можно обойти эти проблемы?
18 ноя 03, 12:34    [422427]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
1. Кто мешает для разных потребностей написать разные процедуры?

2. FAQ1, FAQ2
18 ноя 03, 12:38    [422435]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор писал:
Тогда получается, что удалить несколько записей одной транзакцией невозможно?


Вариантов решения может быть много. Но мне вот всегда не нравилось абстрагирование до уровня записи. Что нужно сделать? Например, Снести все содержание документа - вот и напиши хп - usp_DeleteDocContents @DocID int... То есть на каждую бизнес оерацию можно/нужно иметь хп.

автор писал:
Выборка записей через ХП. IMHO, трудно (а иногда и невозможно) предусмотреть все возможные параметры отбора записей, варианты сортировки и т.п. Как же быть?


Эт почему ж трудно?! ХП, возвращающая набор данных для журнала документов - почему нельзя определить все параметры - можно, вариатны сортировки - не больше, чем число полей. Причем где лучше/проше/быстрее делать сортировку (особенно в режиме cached updates) на сервере/на клиенте можно поспорить.

IMHO, если есть хорошее тз (а оно есть редко) или знания в предметной области, то прощитать на 95% можно. 100% гарантии канечно нет.
18 ноя 03, 13:13    [422527]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
trayal
Member

Откуда: Пенза
Сообщений: 471
2 tpg:
Пока читаю FAQ

2 pkarklin:
Снести все содержание документа - вот и напиши хп - usp_DeleteDocContents @DocID int
Хорошо. А вот понадобилось снести НЕСКОЛЬКО документов по определенному признаку - опять ХП? А потом по другим признакам - опять ХП? Так можно до бесконечности... IMHO.
18 ноя 03, 13:22    [422565]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
2 trayal

автор писал:
А вот понадобилось снести НЕСКОЛЬКО документов по определенному признаку - опять ХП? А потом по другим признакам - опять ХП? Так можно до бесконечности...


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

usp_DelDocumentsByContragents @ContragentID...
usp_DelDocumentsByDate @Date...
18 ноя 03, 13:28    [422590]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
trayal писал:
Тогда получается, что удалить несколько записей одной транзакцией невозможно? На клиенте надо организовывать цикл, вызывающий эту ХП?
Аналогично со вставкой / изменением.

Во-первых, соглашусь с pkarklin насчет уровней абстракции при проектировании базы (и программы в целом). Это вполне разумно - обертывать процедурами не действия в базе, а реализации бизнес-задач.
Во-вторых, если вас страшно ломает иметь две процедуры на удаление (одну - на удаление записи, вторую - на удаление пачки записей), кто вам мешает написать одну процедуру, использующую временную таблицу с id'шниками записей, которые вы хотите удалить? Перед вызовом процедуры записывайте туда хоть один id, хоть все, хоть ни одного. Аналогично со вставкой, изменением.
18 ноя 03, 13:29    [422592]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Друзья! Человека просто ломает бизнес-логику прописывать в ХП!
Но это дело поправимое...
18 ноя 03, 13:34    [422612]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
GreenSunrise
Member

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

Почему вас пугает количество процедур в базе? При их правильном именовании и разграничении прав это даже не слишком затрудняет "читабельность" кода. А гранулярность доступа, основанная на раздаче прав к процедурам первого и второго уровня, может здорово помочь.
18 ноя 03, 13:34    [422615]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
trayal
Member

Откуда: Пенза
Сообщений: 471
по поводу FAQ1.
Привожу кусок кода:
create procedure test 

@pubdateStart datetime=null, @pubdateEnd datetime=null,
@title varchar(80)=null,
@price money=null,
@ytd_sales int=null
as
select pubdate,title,price,ytd_sales from titles
where pubdate between isnull(@pubdateStart,'17530101') and isnull(@pubdateEnd,'99991231')
and title like '%'+isnull(@title,'')+'%'
and price>=isnull(@price,0)
and ytd_sales=isnull(@ytd_sales,ytd_sales)
order by pubdate,title,price,ytd_sales


Решение через "isnul" хорошее, но опять же:
а если вдруг надо "price<isnull(@price,10000000)" ?

А по поводу сортировки... Все зависит от данных. У меня, например, были данные, по которым я предлагал вариантов 12 сортировки по 6 полям. И это ведь не предел. Пользователь мог захотеть еще как-нибудь отсортировать.
Хорошо, когда и администратор и разработчик ПО - один и тот же человек. А если нет? А если администратор уволился, а разработчик не может дописать ХП?
18 ноя 03, 13:48    [422666]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А по поводу сортировки... Все зависит от данных. У меня, например, были данные, по которым я предлагал вариантов 12 сортировки по 6 полям. И это ведь не предел. Пользователь мог захотеть еще как-нибудь отсортировать.
Хорошо, когда и администратор и разработчик ПО - один и тот же человек. А если нет? А если администратор уволился, а разработчик не может дописать ХП?


А на то и называют технологию клиент/сервер, что часть функциональности не грех и на клиента отвалить.
18 ноя 03, 13:51    [422674]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
trayal
Member

Откуда: Пенза
Сообщений: 471
Отвечаю всем по порядку.

2 pkarklin:

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

Да посчитаю-то я сам :)
Смысл в другом. Вдруг понадобится операция удаления по новым критериям, а разработчика БД нет? Кто напишет новую ХП?

2 GreenSunrise:

Во-вторых, если вас страшно ломает иметь две процедуры на удаление (одну - на удаление записи, вторую - на удаление пачки записей), кто вам мешает написать одну процедуру, использующую временную таблицу с id'шниками записей, которые вы хотите удалить? Перед вызовом процедуры записывайте туда хоть один id, хоть все, хоть ни одного. Аналогично со вставкой, изменением.

А кто будет заполнять временную таблицу? Опять ХП?

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

Вот... Как в процедуре второго уровня сделать действие над набором записей, если процедура первого уровня подразумевает действие над одной записью?
Курсором?

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

2 tpg:
Ваши посты практически несовместимы.
Первый:
Друзья! Человека просто ломает бизнес-логику прописывать в ХП! 

Но это дело поправимое...

Второй:
А на то и называют технологию клиент/сервер, что часть функциональности не грех и на клиента отвалить.

Какой же из них верный?

Хочу высказать свои предпочтения.
Я за то, чтобы делать логику на триггерах, на доступах к видам, на ХП.
Считаю целесообразным делать процедуры первого уровня (см. GreenSunrise) на триггерах, выборки на видах (может быть, на функциях??), и некоторую часть остального на ХП.
Но опять же, остается проблема, что используя ХП, клиент может работать только с одним... логическим куском информации (опять же, удалять).
18 ноя 03, 14:25    [422774]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31623
2trayal
Для разных сортировок не нужно делать отдельные процедуры. Введите параметр - как сортировать. Реализация - поищите по форуму.

Разные процедуры делают именно для разной бизнес-логики, для олгически разных действий.
18 ноя 03, 14:27    [422778]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31623
2trayal

Странно... Ваш последний пост, по существу, содержит одну мысль - на процедурах делать нельзя, т.к. разработчик БД может уйти :-)))

Это-же абсурд... А если уйдёт разработчик клиента? :-)

Q:"Абсолютно не пугает. Дело просто в том, что в какой-то момент времени пользователь захочет сделать выборку, не предусмотренную ни одной процедурой. Что тогда?"
A:Написать новую

Q:"Вот... Как в процедуре второго уровня сделать действие над набором записей, если процедура первого уровня подразумевает действие над одной записью? Курсором?"
A:Написать новые

Q:"Смысл в другом. Вдруг понадобится операция удаления по новым критериям, а разработчика БД нет? Кто напишет новую ХП?"
A:Нанять нового

:-)
18 ноя 03, 14:34    [422799]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ваши посты практически несовместимы.
Первый:
Друзья! Человека просто ломает бизнес-логику прописывать в ХП!
Но это дело поправимое...

Второй:
А на то и называют технологию клиент/сервер, что часть функциональности не грех и на клиента отвалить.

Какой же из них верный?


А одно другому не протеворечит (не надо путать бизнес-логику с функциональностью приложения, особенно в части получения отчетов).
18 ноя 03, 14:45    [422836]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
trayal
Member

Откуда: Пенза
Сообщений: 471
2 alexeyvg
Странно... Ваш последний пост, по существу, содержит одну мысль - на процедурах делать нельзя, т.к. разработчик БД может уйти :-)))

Нет, нет, мысль немного не такая! :))

В основном она касалась (и касается) критериев выборки и ее сортировки. Просто мне кажется, что это уже не дело администратора БД.
Пусть разработчик клиентского ПО как хочет, так и сортирует, по каким критериям хочет, по таким и выбирает (по дате, по сумме, и т.п.).

По поводу, например, того же удаления - можно ведь триггер повесить и в нем реализовать логику. Тогда разработчик ПО может писать запросы на удаление как угодно, а триггер уже будет обрабатывать.
18 ноя 03, 14:46    [422839]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
trayal
Member

Откуда: Пенза
Сообщений: 471
to tpg:

Тогда не могли бы Вы поконкретнее объяснить мне, на какие мои слова (вопросы) Вы ответили:
Друзья! Человека просто ломает бизнес-логику прописывать в ХП!

и что означает следующая фраза:
Но это дело поправимое...

А в следующем посте Вы пишете:

А на то и называют технологию клиент/сервер, что часть функциональности не грех и на клиента отвалить
То есть по поводу пункта 2 моего первого поста Вы считаете, что критерии выборки/сортировку можно возложить на клиентское ПО?
18 ноя 03, 14:59    [422873]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
ИМХО, сортировки - да, выборки - нет, а вернее можно и выборки, но через ХП.
18 ноя 03, 15:05    [422889]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Блин, этож всё отчеты... а не логика...
18 ноя 03, 15:06    [422891]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
2 trayal

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

По поводу постов tpg, которые вам никак непонятны.
trayal писал:
То есть по поводу пункта 2 моего первого поста Вы считаете, что критерии выборки/сортировку можно возложить на клиентское ПО

Сортировку - да, но никак не выборку, не путайте опять.

Я вообще не пойму - вам лень писать ХП? Или вообще лень писать чего-то? Или вы просто не знаете, для чего ХП нужны? Или что? Или не можете нормально распределить бизнес-логику по ХП? Или вообще ее определить?

-- Tygra's --
18 ноя 03, 15:15    [422921]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
trayal
Member

Откуда: Пенза
Сообщений: 471
2 tpg

полностью с Вами согласен. Есть логика, есть выборки для отчетов
18 ноя 03, 15:16    [422929]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
2 trayal

автор писал:
Смысл в другом. Вдруг понадобится операция удаления по новым критериям, а разработчика БД нет? Кто напишет новую ХП?


Интересно. А какая разница, что надо написать запрос с клиента или хп если разработчика бд нет?

автор писал:
Вот... Как в процедуре второго уровня сделать действие над набором записей, если процедура первого уровня подразумевает действие над одной записью?
Курсором?


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

автор писал:
Абсолютно не пугает. Дело просто в том, что в какой-то момент времени пользователь захочет сделать выборку, не предусмотренную ни одной процедурой. Что тогда?


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

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


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

автор писал:
Но опять же, остается проблема, что используя ХП, клиент может работать только с одним... логическим куском информации (опять же, удалять


Вот это вот я не понял. 8-) Что эта за проблема и что за логический кусок информации??? Что позволено делать конкретному пользователю в соответствии с бизнес-логикой и правами доступа - то и делай.

автор писал:
В основном она касалась (и касается) критериев выборки и ее сортировки. Просто мне кажется, что это уже не дело администратора БД.
Пусть разработчик клиентского ПО как хочет, так и сортирует, по каким критериям хочет, по таким и выбирает (по дате, по сумме, и т.п.).


Нет уж. А потом вы будете админа трясти, а че это у нас как медленно работает. А потом вы почему то всегда упоминатете разработчика, без указания чего он разрабатывает - если это кодер клиента, то ему наооборот будет проще, если разработчик бд предоставит ему полный набор хп, для выполнения всех действий нежели вы дадите ему схему данных и скажите сортируй как хочешь, выбирай как хочешь. Вот это вот как хочешь, папахивает - быстренько чего-то набросать (в этом случаи прямой доступ к таблицам с помощью запросов даст выигрыш во времени), вместо того, чтоб спроектировать на хп (триггерах) бизнес-логику.
18 ноя 03, 15:17    [422933]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
Смысл в другом. Вдруг понадобится операция удаления по новым критериям, а разработчика БД нет? Кто напишет новую ХП?

а тут уж либо-либо:
либо самостоятельный продукт, который может быть сделан исключительно на основе законченного техзадания, и поэтому новая операция понадобиться в принципе не может, а если и может - то это уже новая задача.
либо разработчик в штате предприятия - как компенсация за неполное ТЗ или его отсутствие.
18 ноя 03, 15:28    [422963]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
trayal
Member

Откуда: Пенза
Сообщений: 471
to tygra:

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

Сортировку - да, но никак не выборку, не путайте опять

А можно ли отсортировать на клиенте выборку, полученную из ХП?

Я вообще не пойму - вам лень писать ХП? Или вообще лень писать чего-то? Или вы просто не знаете, для чего ХП нужны? Или что? Или не можете нормально распределить бизнес-логику по ХП? Или вообще ее определить?


Нет, мне не лень, я знаю, для чего нужны ХП, могу определить бизнес-логику и т.д.

Вопросы мои изначальные не чисто практические; мне хотелось бы узнать, как люди, реализующие ВСЮ логику на ХП, решают проблемы (а может, никаких проблем в этом и нет), которые я обозначил в первом посте.
18 ноя 03, 15:39    [422988]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
Oleon
Member

Откуда:
Сообщений: 361
Уважаемый, pkarklin! А чем плохи курсоры? Если не трудно, объясните пожалуйста. Хотя бы в двух словах. Спасибо.
18 ноя 03, 15:43    [422998]     Ответить | Цитировать Сообщить модератору
 Re: Вся логика - на ХП?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
2 trayal

автор писал:
А можно ли отсортировать на клиенте выборку, полученную из ХП?


Можно. TADODataSet и TSQLDataSet поддерживают локальную сортировку.

2 Oleon

автор писал:
А чем плохи курсоры? Если не трудно, объясните пожалуйста. Хотя бы в двух словах


Ну если в двух словах то большие тормаза. :-)
18 ноя 03, 15:52    [423020]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить