powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / А зачем нужен этот монстр....... MS SQL?
403 сообщений из 403, показаны все 17 страниц
А зачем нужен этот монстр....... MS SQL?
    #32003668
Kalin Saten
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не против скорости и мощности данного сервер (обсуждаемо)...
Однако, считаю устаревшей технологию хранимых процедур и триггеров...
В SQL сервере главное скорость и надежность, а вся логика, находящаяся
внутри вашей базы будет этому только мешать.
Встает так же вопрос переносимости! Приспичит вам завтра использовать ваш
сервер под unix (не приведи господь) и куда пойдут все ваши годы работы
над такой базой?
Кстати, новость (была для меня)..... NASA с Oracle перешла на MySQL...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003675
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, нам срочно нужна собственная космическая программа. А MySQL стоит переименовать в NASA SQL. Хорошо бы и минестерство обороны США тоже пересело на MySQL. А вообще то при таких заявлениях принято давать ссылочку на источник, если это не www.anekdot.ru
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003678
Kalin Saten
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ссылочка очень простая......
www.mysql.com
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003701
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kalin, ты определись, кого ты больше не любишь. А то в subject'e наезжаешь на MS, в body - на Oracle. Когда кажется, что все кругом козлы, а ты - д'Артаньян, то это не сюда, это к психиатру.
Кстати, за ссылочку спасибо, а то я раньше не знал, что это за зверь такой - MySQL? Зато теперь вот сходил на http://www.mysql.com/doc/M/i/Missing_functions.html и понял - капец Альфе.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003750
Kalin Saten
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я наезжал???...... Я наезжал!!!
На хранение логики в базе данных,
на усложнение переносимости базы, связанной с этим,
на снижение производительности при ее обработке,
на узость взглядов и плохую погоду...
Хранение какой-либо логики в самой базе может позволить
себе лишь Дед Мазай, которому надо пересчитать зайцев,
а разработка чуть более серьезной системы распределенных
данных на этом основываться не может...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003799
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы хранение какой-л. логики в базе мог позволить себе только Дед Маздай, то и говорить не о чем. К сожалению, его заблуждения разделяют д-р Кодд, и Американский национальный ин-т стандартов (ANSI) и многие другие известные люди и организации. Конечно, Kalin Saten может придерживаться точки зрения, что им всем, кроме как зайцев считать, больше делать нечего в то время, как он, д'Артаньян, разрабатывает "серьезную систему распределенных данных". Хотя лучше все-таки к психиатру. Ему же пожалуешься на "узость взглядов и плохую погоду". А то и впрямь погоды нонче стоят страсть неровные, не ровен час, обострится.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003830
Kalin Saten
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче, провакация не удалась..........
А то я думал мне под это дело коротенечко объяснят все преимущество MS SQL...
Ан нет... Дед Маздай отправляет к психиатру... По-видимому тот таки в отличии от него сможет это сделать профессиональнее...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003873
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слушай, у тебя и впрямь проблемы со здравым смыслом, если в ответ на свой грязный наезд в адрес SQL Server, ты рассчитываешь получить "коротенечко" лекцию о преимуществах. В подавляющем большинстве ситуаций ты получишь очень много, но совсем другой вещи.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003877
А теперь давайте граждане успокойтесь!
Кое в чем я не согласен с Kalin Sateen, но есть и определенная доля правды в его словах.
"Переносимость" действительно страдает! Мне самому приходилось не раз переезжать с MS SQL, поэтому знаю...
Кстати, у Деда Маздая точно есть проблемы. Грязного наезда я тут так и не увидел.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003894
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kalin Saten, Евгений Вавилов или как тебя там. Ты решил, что твои высказывания стали умнее от того, что ты подписался другим ником? Вынужден тебя разочаровать. Между прочим, когда человек называет себя разными именами, не согласен (кое-в-чем) сам с собой и т.д., это называется раздвоение личности. Послушай старика - сходи к психиатру. Пока не поздно.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003905
??? У Деда крыша поехала???
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003907
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если учесть, что все предыдущие сообщения от моего имени написаны не мною, то мой двойник действительно прав. Всем нам срочно нужен психиатр.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003908
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поспешил ты всех то отправлять в психушку. Разберись сначала с собой. А то твоя мания величия уже начинает немножко надоедать. То ты MySQL опускаешь, то Oracle. Не хорошо это.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003909
Kalin Saten
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо подождать пока Дедов поуменьшиться, а то я начал терять ход их мыслей.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003910
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эк тебя разобрало-то. Аж анонимайзером прикрылся. Все-таки недалекий ты человек, раз до сих пор не понял, что тебя выдает не IP, а ход твоих мыслей, точнее, полное их отсутствие. Впрочем, доказывать дураку, что он дурак, бессмысленное занятие.
Эта дискуссия потеряла для меня всякий интерес, так как выродилась в абсолютнейшую свару. Хотя, судя по характеру первоначального сообщения, она и замышлялась автором не более, как свара. Жаль, что я поддался на эту провокацию.
Ладно, я пошел. Можешь тут всласть повыступать от моего имени (только сначала научись русскому языку, а то на Западном побережье по-русски пишут грамотнее, чем в Туле) и от себя, любимого, под разными приправами. Не злоупотребляй женскими именами - мало того, что дурак, еще и пидором станешь.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32003913
Kalin Saten
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень рад, что у Вас нашлось время почитать логи. К сожалению, это не прибавило весомости вашим аргументам - пойти к психиатору и т.д.
Так же завидую Вашей уверенности, с которой Вы посвящаете людей в дураков и пидаров. Это достойное качество "профессионала". Вам следует его развивать! Жаль, что мой немного провакационный вопрос, был воспринят как оскорбление и жесткий флейм. Таковым он не задумывался. Однако, вероятнее всего, причиной такого выступления в мой адрес явилась моя попытка задеть потребность в инструменте, которым Вы, по все видимости, владеете лучше всего. Поэтому в заключение хочу заметить, что никогда отличное владение отверткой (MS SQL) не поможет починить трухлявый шкаф (плохую идею). В этом собственно и состоял мой вопрос.

До свидания.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32006165
andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А кто вас собственно заставляет пользоваться хранимыми процедурами и триггерами? Да иногда они замедляют работу (если вы конечно не зайцев считаете), но если их с умом применять, то можно какую-то пользу извлечь. Например если у вас есть какие-то сложные вычисления, которые требуют перманентного обращения к БД, то можно перенести это в SP и получить выигрыш в производительности (переключений контекстов будет меньше, и данных между бизнес логикой и СУБД меньше ходить будет).

Все выше сказанное - ИМХО.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32008558
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то это новенькое для меня, чтоб SP замедляли работу... Как никак план уже построен и на его формирование не надо тратить время. А если расстраивает то что статистика при этом устаревает так использовать с перекомпиляцией.
Хотелось бы услушать конкретные аргументы почему по Вашему от них замедляется работа
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32009998
Alex Fogol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, насколько я знаю, и с SQL Server можно работать почти напрямую, вплоть до того, что вклиниваться в его движок. Разве нет?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32010062
XAOC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это как напрямую?! Я весь MSDN облазил, кроме заторможенного ADO ничего не нашел.
Все DB-library, добрые ESQLи, MicroSoft уже считает устаревшими и не рекомендует их использовать. Может , что- то пропустил. Тогда помогите, научите,обьясните.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32010090
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме заторможенного ADO есть ещё быстрый OLE DB. Но программировать на нём не проще, чем на DB-library или ODBC (а может и сложнее).
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32010165
XAOC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MSDN не пишется что OLE DB это работа напрямую, да и уж больно запутан этот OLE.
Насколько проще программировать Interbase по сравнению MS SQL, на его родных API. Или я неправ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32010178
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в каком месте ADO тормозит? ADO - это прописанная на C обертка вокруг OLEDB. Утверждать что OLEDB или ODBC быстрее или медленне не возьмусь - это и есть native доступ. Про это в BOL сказанно:

Native API Support

Native API support means the API function calls are mapped directly to the network protocol sent to the server. There is no intermediate translation to another API needed. SQL Server 2000 provides native support for two main classes of database APIs:

OLE DB
SQL Server 2000 includes a native OLE DB provider. The provider supports applications written using OLE DB, or other APIs that use OLE DB, such as ActiveX Data Objects (ADO). Through the native provider, SQL Server 2000 also supports objects or components using OLE DB, such as ActiveX, ADO, or Windows DNA applications.

ODBC
SQL Server 2000 includes a native ODBC driver. The driver supports applications or components written using ODBC, or other APIs using ODBC, such as DAO, RDO, and the Microsoft Foundation Classes (MFC) database classes.

An example of nonnative support for an API would be a database that does not have an OLE DB provider, but does have an ODBC driver. An OLE DB application could use the OLE DB provider for ODBC to connect to the database through an ODBC driver. This provider maps the OLE DB API function calls from the application to ODBC function calls it sends to the ODBC driver.

Additional SQL Server API Support
SQL Server 2000 also supports:

DB-Library
DB-Library is an API specific to SQL Server 2000 and Microsoft SQL Server. SQL Server 2000 supports DB-Library applications written in C. DB-Library has not been extended beyond the functionality it had in Microsoft SQL Server version 6.5. Existing DB-Library applications developed against earlier versions of Microsoft SQL Server can be run against SQL Server 2000, but many features introduced in SQL Server 2000 and SQL Server version 7.0 are not available to DB-Library applications.

Embedded SQL
SQL Server 2000 includes a C precompiler for the Embedded SQL API. Embedded SQL applications use the DB-Library DLL to access SQL Server 2000.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32010187
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADO тормозит из-за следующего:
- ADO - это высокоуровневая обертка вокруг OLEDB (т.е. вокруг native API)
- ADO - это ActiveX компонент; если Вы представляете, что такое маршаллинг...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32010192
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто хочется понять для решения каких именно задачь скорость работы через ADO становится неудовлетворительной.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32010221
Alexander Chepack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто хочется понять для решения каких именно задачь скорость работы через ADO становится неудовлетворительной?
-------------------------------------

Присоединяюсь к вопросу.

Кроме этого - no offence meant - мой личный опыт говорит, что если кто-то хочет залезть в SQL Server на уровне движка ) - то в 99% случаев, этому кому-то просто нечего делать - если человек занят реальным делом, этого почему-то не требуется...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32010234
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не говорю что скорость работы становится неудовлетворительной, я говорю, что она будет меньше.
Вообще выбор средства доступа - задача сложная...

Могу поделиться своим опытом.

Проекты, использующие Data-Bound компоненты всегда остаются самописками - они не живут сколько-то приличное время, работают в присутствии разработчиков, не тиражируются и т.д. На этом можно сделать отчёт для начальника, но не больше.
Проекты, использующие компоненты типа АДО ВНУТРИ текста (т.е. стиль MyVar = RS( "MyField" ) ) - то-же самое.
Во ВСЕХ реально работающих проектах, которые я знаю, работа с БД организована через своё API. При этом в модулях, его реализующих, может использоваться и, к примеру, АДО, а может и native API.
Во ВСЕХ продающихся западных системах, которые я знаю, работа с БД организована через своё API, в свою очередь реализованное через native API.

Кстати в использовании native API ничего страшного нет. Я его неоднократно использовал в проектах. Если стоимость проекта 20-50 чел/мес, то выделить 1-3 ч/м для написания этого доступа - это не сложно.

И главное преимущество в использовании native API - это не скорость, а стабильность работы. Например, установка браузера или сервис-пака или ещё чего-то вносит изменение в поведение
ADO, что для большой программы становиться критичным.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32010244
olden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
начиная с 7-й версии с MS SQLServer стало возможным работать. Однако мне кажется: если хочется использовать Oracle - трижды подумай, может MS SQLServer больше подойдет, а если и правда подойдет, то подумай еще, может и InterBase справится. Большие системы не всегда самые мощные и быстрые. Есть у MS SQLServer один ааагромный недостаток - привязка только к виндам. А в наше время это минус, минус и еще раз минус
Насчет ADO. Попробовал тут как-то в Delphi через OLE DB for ODBC с DBF-файлом связаться (где-то тысяч сто записе при десятке полей) так он мне всю душу вымотал пока в гридину данные загрузил. А вот через делфовский BDE моментально данные выгреблись Насчет MySQL. Лучше возьмите InterBase под Linux. И у вас будет полноценная СУБД. Кстати, как правило, верить компаниям-разработчикам нельзя. Там в NASA куча подразделений. Может кто-то и начал возиться с MySQL, а разработчики сразу рекламу толкают мол "мы - уже и в NASA" Это общая болячка такая
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
А зачем нужен этот монстр....... MS SQL?
    #32053856
The Lex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex Fogol wrote:
"Кстати, насколько я знаю, и с SQL Server можно работать почти напрямую, вплоть до того, что вклиниваться в его движок. Разве нет?"

Интересно, и что конкретно я имел в виду? :)

Если уж зашел вопрос о том, чем пользоваться, то тут мое мнение примерно таково:

- разработки на C: ODBC
- разработки на C++: ODBC или OLE DB, но можно и ADO.
- разработки на VB: ADO.

ADO - посто очаровашка под VB. OLE DB и ADO очень трудно будет использовать из C, так как... ну не для него они писаны. Под C++ все прекрасно заворачивается в классы и шаблоны и легко используется. Но по-моему ADO в этом случае выглядит несколько более громоздко, по-сравнению с OLE DB. Кстати, OLE DB по сравнению с ODBC иногда тоже.

По функциональности:
ADO позволяет все (или все же почти все), что позволяет OLE DB, и добавляет к этому много чего своего. И это понятно: ADO - "интеллектуарная" обертка для OLE DB. Судя по всему OLE DB позволяет больше, чем ODBC. Если сравнивать ODBC-драйвер и OLE DB Provider для MS SQL Server. Впрочем, это касается не только MS SQL.

По скорости:
ADO в принципе медленнее всех. Но... Разве это так важно? По-моему важно еще и то, что есть ADO.NET и за ним будущее. По крайней мере на платформе .NET. Сравнивать OLE DB и ODBC не возьмусь. Уж больно принципы разные: ODBC - это "чистый API", OLE DB - это COM.

Через OLE DB можно работать с любым драйвером ODBC. По-моему, при этом теряется как в скорости, так и в функциональности.

Что касается доступа к БД "через свой API" - не знаю, никогда не пробовал и пробовать не собираюсь.

Ну и насчет "монстровидности" MS SQL: сам с большим удовольствием использую MS Access в качестве хранилища данных с некоторыми замашками на БД. Как только там становится больше БД, чем просто места для складывания данных, так сразу же стоит уходить на сервер БД. По-моему все ж лучше на MS SQL Server - он ближе будет, под Windows прекрасно становится, имеет обширное число вариаций, хорошо документирован, имеет бесплатный вариант. Единственное, из-за чего перешел бы на другой - это если б "жизнь заставила": требования заказчика, т.е.

Таково мое скромное мнение. Но что все таки я имел в виду в том своем постинге?! :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32053870
Silver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дожились! Или дожили! :)
Вот уже отдельный личности стали MS SQL сервер величать " монстром ". Ранее сего почетного отличия удостоены были системы не ниже DB2 или ORACLE.
Того и гляди, начнутся призывы всем перейти на MySQL и вообще пора вернуться на деревья. В смысле на иерархические СУБД. :)

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

Ну и к вопросу о замедлении работы системы ХП и тригеррами: ускорение работы при отказе от тригерров может произойти только в том случае, когда вы откажетесь от функциональной логики в них заключенной. Если вы эту же логику перенесете на клиента, пройзойдет только замедление системы. Даже в случае 1 сервер - 1 клиент.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32059994
khl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
//лучше на MS SQL Server - он ближе будет, под Windows прекрасно становится, имеет обширное число вариаций, хорошо документирован, имеет бесплатный вариант.//

Что за вариант - который бесплатный?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32060023
Фотография Lexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бесплатный - это видимо evaluation copy на 120 дней
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32070492
Thorr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, бесплатный - это который MSDE.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32070515
f_w_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Нет, бесплатный - это который MSDE."
Уж больно много в нем ограничений!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
А зачем нужен этот монстр....... MS SQL?
    #32705039
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kalin SatenКстати, новость (была для меня)..... NASA с Oracle перешла на MySQL...

NASA switches from Oracle to MySQL

NASA switches from Oracle to MySQL NASA switches from Oracle to MySQL 4 January 2001 In November a team at NASA's Marshall Space Flight Center finished the transition of the NASA Acquisition Internet Service (NAIS) from Oracle to MySQL. NAIS sends e-mail notifications to users based on specified interests and enables users to query the Web site (nais.nasa.gov) for updated opportunities. Dwight Clark, project leader of NAIS, claims to have noticed an increase in speed of
http://www.mysql.com/news-and-events/news/article_51.html

NASA

а вообще-то человек прав со своей плоскости зрения,

но есть много НО:

если клиент и сервер БД в разных сетках, то для обработки тащится весь ДатаСет, что ни есть хорошо

второе NASA пересело на коммерческую версию MySQL, в которой так же есть хранимые процедуры и функции...

в моей конторе был такой казус - на уровне юмора из жизни:
подрядчик не имел лицензии на Оракл и поэтому решил все делать на Майкрософт Сервер, а потом все переписать на Оракл.

К тому моменту, когда он купил лицензию, им было написано 4 тыс хранимых процедур. Естественно, они оказались непереносимы.

В итоге - нам пришлось покупать лицензию на Майкрософт сервер...
Вот такие пироги.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32714447
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Кстати, насколько я знаю, и с SQL Server можно работать почти напрямую, вплоть до того, что вклиниваться в его движок. Разве нет?"
SQL Server идеальное решение для небольших крапоративных систем,
или больших, но с небольшими базами, или с не распределенными базами...

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

Оракл - он потежелее и его изучать дома - потруднее....

Вот так ....
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32714932
Фотография Диченка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akalend "Кстати, насколько я знаю, и с SQL Server можно работать почти напрямую, вплоть до того, что вклиниваться в его движок. Разве нет?"
SQL Server идеальное решение для небольших крапоративных систем,
или больших, но с небольшими базами, или с не распределенными базами...

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

Оракл - он потежелее и его изучать дома - потруднее....

Вот так ....

Сказал как в лужу пернул...
Что в твоем понимании "большая база" ? Много ты написал "больших баз" на MSSQL ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32715117
Достали
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NASA с Oracle перешла на MySQL...

Как-же достали уже этой байкой... Перевели сервис рассылки емейлов на MySQL а кричат как будто вся NASA перешла на MySQL.
Так-же у людей фобия может развиться - "боязнь падения космического корабля на голову".

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

P.S. CACHE кстати тоже добивает своими success story про СпидиГонсалеса из Аргентины, который какую-то поделку с Оракла в CACHE переделал и у него в 3 раза быстрее летать стало.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32715139
Достали
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
akalend
SQL Server идеальное решение для небольших крапоративных систем,
или больших, но с небольшими базами, или с не распределенными базами...

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

Оракл - он потежелее и его изучать дома - потруднее....


Дык для изучения Оракл БЕСПЛАТЕН. Даже не нужны "пиратские версии".
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32715916
Petr Chulkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Достали

Дык для изучения Оракл БЕСПЛАТЕН. Даже не нужны "пиратские версии".

а кто мешает скачать тот же MSDE с сайта фирмы-производителя и тоже бесплатно его изучать ?

только вот не надо за ограничения -- с такими ограничениями он успешно может не только для изучения подойти, но и для небольших контор (там разрешено 5 одновременно выполняющихся запросов - иногда даже это много)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32718279
Denis A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНасчет ADO. Попробовал тут как-то в Delphi через OLE DB for ODBC с DBF-файлом связаться (где-то тысяч сто записе при десятке полей) так он мне всю душу вымотал пока в гридину данные загрузил. А вот через делфовский BDE моментально данные выгреблись

ты не читал документацию. Это общая болезнь юнцов, которые читают форумы и на основании этого делают какие-то выводы. Перед использованием системы стоит прочитать хотя бы об общих принципах работы с ней.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32718527
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32720853
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
знаю, что отвечаю на древний пост, но решил осмыслить для себя (или чтобы поправили):

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

А что еще?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32720854
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Достали akalend
SQL Server идеальное решение для небольших крапоративных систем,
или больших, но с небольшими базами, или с не распределенными базами...

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

Оракл - он потежелее и его изучать дома - потруднее....


Дык для изучения Оракл БЕСПЛАТЕН. Даже не нужны "пиратские версии".

По поводу SQL Server - это было верно для версий 6.5 и ниже.
Сегодня это уже неверно.

Водораздел проходит не по размеру базы данных, а по функциональности приложений. И по режиму работы с данными. SQL Server 2000 - по-прежнему блокировщик...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32721732
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pi
Триггеры создавались ... обеспечить
- независимость логики данных от логики приложений, в том числе приложений чужих и устаревших
- обеспечить централизованное управление логикой данных - вне зваисимости от количества существующих приложений


Нет. Вообще триггера появились в СУБД для реализации ссылочной целостности и реализации примитивной бизнес-логики.
Хотя я бы сказал, что для реализации последнего они в принципе не подходят.
С появлением хранимых процедур и декларативной ссылочной целостности триггера должны сдохнуть как класс.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32721814
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНет. Вообще триггера появились в СУБД для реализации ссылочной целостности и реализации примитивной бизнес-логики.
Хотя я бы сказал, что для реализации последнего они в принципе не подходят.
С появлением хранимых процедур и декларативной ссылочной целостности триггера должны сдохнуть как класс.
Ну уж нет. С чего им спрашивается дохнуть ? Ну ка проконтролируйте в бизнес-логике через ХП запрет на удаление задними числами "CreateDate < @@CalcDate", где клиентское приложение делает "DELETE FROM Table WHERE ...". Или Вы считаете, что оно должно открывать курсорчик и по записи лопатить и удалять ? В плане контролирования бизнес-логики в операциях с множествами триггера самое удобное для этого места (особенно если в СУБД есть поддержка BEFORE/AFTER FOR ROW/STATEMENT).
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723032
Фотография www.fun4me.narod.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ACRUS
С чего им спрашивается дохнуть ? Ну ка проконтролируйте в бизнес-логике через ХП запрет на удаление задними числами "CreateDate < @@CalcDate", где клиентское приложение делает "DELETE FROM Table WHERE ...". Или Вы считаете, что оно должно открывать курсорчик и по записи лопатить и удалять ? В плане контролирования бизнес-логики в операциях с множествами триггера самое удобное для этого места (особенно если в СУБД есть поддержка BEFORE/AFTER FOR ROW/STATEMENT).


Клиентское приложение не должно полагать, что оно имеет право выдумывать свои собственные операции по работе с данными. Если требуется удалить строки с какими-то опциями, то почему бы не написать процедуру сп_Удалить_Кучу_Записей, с параметрами? В процедуре проверка. И вуаля! Всё просто, быстро и понятно. И переносимо, если процедуры через ODBC {call ...} вызываются.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723076
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Нет. Вообще триггера появились в СУБД для реализации ссылочной целостности и реализации примитивной бизнес-логики.
Хотя я бы сказал, что для реализации последнего они в принципе не подходят.
С появлением хранимых процедур и декларативной ссылочной целостности триггера должны сдохнуть как класс.

Все-таки, скрее всего, триггеры появились для реализации пользовательских ограничений целостности, т.е. тех, которые не могут быть реализованы декларативно в данной версии СУБД. Но главное, триггеры - это ХП процедуры, которые вызываются в ответ на события, связанные с изменением состояния БД. Кроме изменения данных, логон, закрытие, DDL. Поэтому они могут быть использованы для пользовательского аудита, для извещений об изменении состояния БД (например, что появились критические данные), для создания пользовательских репликаций и проч. В общем отказываться от них вряд ли стоит: механизм вызова процедур в ответ на события всегда имеет значение.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723226
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
другими словами:

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

В этом отличие.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723260
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024
другими словами:

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

В этом отличие.

Как посмотреть. Процедуры вообще обыкновенно срабатывают независимо от желания клиента, так он часто не желает про них ничего знать. Впрочем, их можно отключить в том числе и клиенту. С другой стороны, некоторые процедуры вызываются в том числе или только из тела триггера. Как написать. Главное, чтобы у разработчика была такая возможность в зависимости от его желаний.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723339
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
www.fun4me.narod.ruКлиентское приложение не должно полагать, что оно имеет право выдумывать свои собственные операции по работе с данными. Если требуется удалить строки с какими-то опциями, то почему бы не написать процедуру сп_Удалить_Кучу_Записей, с параметрами? В процедуре проверка. И вуаля! Всё просто, быстро и понятно. И переносимо, если процедуры через ODBC {call ...} вызываются.
Клиентское приложение, а так же администратор и проектировщик БД, вправе полагать, что SQL был придуман не только для его использования в хранимых процедурах. Поэтому как клиент, так и клиентское приложение имеют полное право (если конечно есть нужный грант) выполнить DELETE FROM и не "изобретать" процедуру "с кучей параметров" и "геммора". А сама БД вправе полагать, что любое изменение данных, вне зависимости откуда оно будет произведено - с процедуры, ISQL или с менеджера БД и кем - юзером, админом или овнером, будет всегда контролироваться логикой и любое изменение информации приведет к проверке условий, пересчету аггрегатных таблиц и прочих действий. Кроме триггеров больше никто этого гарантировать не может. Так что перед законом все должны быть равны. Хотя тут уже в силу вступает реализация триггеров в каждой СУБД - если она где то урезана функционально, то может действительно оказаться выгоднее все проводить через ХП. У меня, например, в ASA триггера сделаны очень толково - те же BEFORE триггера срабатывают до проверки CHECK и CONSTRAINTS и на момент блокирования записи до начала логирования операции над таблицей. Соотвествующе это дает прекрасную возможность инициализировать значения полей собственными значениями (например если в поле NULL, то занести в него свое значение, или же принудительно привести текстовое поле к верхнему регистру и т.д.). Плюс это позволяет в случае генерации ошибки из триггера быстро откатить операцию, раз не было физической записи в БД и логе и снизить время и ресурсы блокировки обрабатываемых записей (например, если уже на первой записи из обрабатываемого миллиона записей не прошло условие и триггер дал откат, то на текущий момент только первая запись и была блокирована писателем, следующие уже записи блокироваться не будут, операция будет просто прервана). Могу ошибиться, но по моему в Оракле используется такая же эффективная схема работы триггеров (единственное, что там не хватает - это AFTER триггеров на весь массив записей с доступом к нему из триггера, ко временной таблице). Так что в таких случаях по моему грех отказываться от триггеров.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723434
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo
Все-таки, скрее всего, триггеры появились для реализации пользовательских ограничений целостности, т.е. тех, которые не могут быть реализованы декларативно в данной версии СУБД.


Триггера появились в СУБД ДО появления поддержки декларативной ссылочной целостности.

vadiminfo
Но главное, триггеры - это ХП процедуры, которые вызываются в ответ на события, связанные с изменением состояния БД. ...

Можно вместо DML вызывать процедуру. Тогда никаких событий не нужно. Все то же самое можно сделать и в процедуре. Процедура имеет нормальную и гибкую логику работы ( в отличие от триггеров, работа которых должна быть согласованной с основной модификацией данных, производится ТОЛЬКО внутри транзакции и т.п.). Процедура позволяет скрывать от приложения структуру базы данных, что добавляет доп. гибкость. В последнее время во всех СУБД развивается декларативная ссылочная целостность (каскадные удаления и прочие операции). В итоге мораль - триггера будут скоро просто не нужны, а уж о их вреде (для производительности, в основном) давно известно (правда оговорюсь - это зависит от СУБД).
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723560
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВ итоге мораль - триггера будут скоро просто не нужны, а уж о их вреде (для производительности, в основном) давно известно (правда оговорюсь - это зависит от СУБД).
Я бы сказал, что производительность и эффективность триггеров наверное даже больше не от СУБД зависит, а от драйвера "ПрямыеРуки.sys" :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723641
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласен что для современных систем триггеры и прочая фигня, вполодь до ссылочной целостности зачастую уже и не нужно. Объясню почему. Раньше народ писал клиент-серверный софт и тогда, чтобы им не заморачиваться с отслеживанием на клиенте целостности и непротиворечивости данных в БД использовались триггеры и хр.процедуры. Сейчас софт пишут с использованием 3х- и более звенной архитектуры, где вся бизнес логика сосредоточена на сервере приложений, который и отвечает за работу с данными. Типичный пример такой работы - технология J2EE, используя entitybeans можно прекрасно обходится без всех дополнительных наворотов БД, включаю аутентификацию пользователей. Так, например PDM система Windchill вообще не использует никаких преимуществ Оракла, обходясь только обычным хранением данных в таблицах, для чего мог сойти и mysql. При этом очень удобно работать с данными. Фактически клиентское приложение, а это зачастую JSP/Servlet клиент работает с обычными объектами языка java не думая о том как и где они хранятся.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723781
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор Раньше народ писал клиент-серверный софт и тогда, чтобы им не заморачиваться с отслеживанием на клиенте целостности и непротиворечивости данных в БД использовались триггеры и хр.процедуры. Сейчас софт пишут с использованием 3х- и более звенной архитектуры, где вся бизнес логика сосредоточена на сервере приложений, который и отвечает за работу с данными

Очень резкое завление, учитывая "всех" тех, кого вы упоминаете, составляющих 5-10% от всего рынка систем. Если лично вы пишете софт с помощью J2EE, то это не значит, что делают все так.

Или вы год перепутали и сейчас уже 20 55 ?

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723789
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточнение: не рынка систем, а всех разрабатываемых систем - а то ведь придерутся, скажут, что продается три системы и все они не используют устаревшие методы, использующие ХП и триггеры

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723829
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ведь мы с вами не будем жить вчерашним днем!
Клиент-сервер устаревшая технология, хотя и будет всегда использоваться для небольших систем. А вот удел большиi систем - многозвенные технологии. Хотя абсурдно получается, что для боьших систем достаточно mysql. А для остальных нужены MS SQL и Oracle ))
Кста, вот пример, SAP устаревшую систему R3, в скором будущем не будет сопровождать, а весь упор делается на систему mySAP ERP, которая как раз и написана на J2EE, использующая распределенные вычисления и компонентную структуру.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32723978
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С ума сойти. Может быть уже и SQL устаревшая технология ? Какие революционные заявления однако :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724113
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
представители новых технологий, ответьте представителю устаревших!

допустим есть таблица проводок, добавление/удаление/модификация записей должна вызывать изменение в таблице остатков. На другой уровень (с сервера на клиента или промежуточный уровень) выносить нельзя - должно быть в одной транзакции. Проводки вставляются из разных мест, где по одной, где по несколько, удаляться тоже могут по каким-то заранее неизвестным условиям(допустим удалить все документы переоценки за какой-то день и проводки к ним). Как вы обычно такое реализовываете, что б без триггеров?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724183
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Представители новых технологий на такие вопросы не отвечают - они про такое просто не знают, у них есть одно магическое слово J2EE и в их новейших системах никаких проводок нет вообще - там коммунизм

Может они знают все-же, сколько внедрений SAP/R3 по России и по всему миру и сколько десятых процента это будет от всех систем.

И еще - новейшим товарищам предлагаю еще обязательно добавлять к J2ee еще и Windows must die , а то иначе как-то не то получается

Да, SAP скоро сопровождать не будет - лет этак через 30 перестанет

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724213
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SergSuperпредставители новых технологий, ответьте представителю устаревших!

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

одной транзакцией все это и делается, причем тут триггер? существует объект который называется "проводка", при изменении этого объекта нужно выполнить 1 транзакцию, в которой выполнить 2 операции изменения 2х таблиц БД, затем транзакцию завершить либо отменить, если объект поймал исключение.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724238
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну? Так и чем лучше ваша трехзвенная технология? Хотя бы в конкретном этом примере?

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724241
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот в лучшей СУБД всех времён и народов для таких случаев есть materialized view, в том числе и refresh on commit.

Требую отставки Президента РФ
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724264
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Был уже топик по поводу многозвенок - почитайте его, чтобы тут флэйм не раздувать.

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724272
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предыдущее мое к savage79

2 Scott Tiger

Про оставку - это в сторону или ваша предвыборая компания?
Я тоже требую отставки президента РФ. И США

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724327
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tygraНу? Так и чем лучше ваша трехзвенная технология? Хотя бы в конкретном этом примере?

-- Tygra's --
а тем что работаешь не с таблицами БД, а с объектами языка программирования и не ломаешь голову о том как и какие запросы нужно делать, все это делает какая-нить служба persistent manager сервера приложений.

Далее, трехзвенная архитектура нужна для разработки больших и сложных приложений, где сервер приложений работает круглые сутки и обслуживает запросы пользователей или других информационных систем. Такие системы могут иметь множество интерфейсов для работы пользователя, например как графический интерфейс GUI так и веб-интерфейс. Интерфейсы занимаются только отображением и вводом информации. А вся бизнес логика сосредоточена на сервере приложений, который может взяимодействовать с сервером БД, сервером LDAP для аутентификации пользователей и пр. звеньями системы. Может взаимодействовать с другими серверами приложений, отвечающих за другие бизнес функции.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724350
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
новые, не новые - признаем сразу sql в прошлом, oop - sux. будующее за XQL (или как там язык запросов на xml завется) и сервис-ориентет программированием :) а то обсуждаете тут технологии 30 летней давности :)

ЗЫ. шучу
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724364
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иногда вынос бизнес логики в SP рассматривается как отдельный уровень приложения. Это к вопросу об n-звенных структурах.

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

Тогда поймете что, как и когда применяется и какие у этого последствия. А размахивать рекламными слоганами - это детский сад.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724377
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savage79 неправильно воспринимает БД как black box со сложной технологией доступа к нему. Неэффективность persistent manager-ов доказана, сложность любого ООП-языка на порядки выше любого диалекта SQL, куда естественней, проще и производительней сделать простой селект от таблицы, чем (ёпти!) в цикле по коллекции первичных ключей вызывать геттеры.

Требую отставки Президента РФ
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724388
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак меняю термины, получается:
РСУБД нужна для разработки больших и сложных приложений, где сервер баз данных работает круглые сутки и обслуживает запросы пользователей или других информационных систем. Такие системы могут иметь множество интерфейсов для работы пользователя, например как графический интерфейс GUI так и веб-интерфейс, для реализации которых существует множество проверенных временем ПО. Интерфейсы занимаются только отображением и вводом информации. А вся бизнес логика сосредоточена на сервере баз данных, которому ни с кем особо без необходимости не нужно взаимодействовать.

И где тут наглядное преимущество 3-его звена ? Судя по высказыванию:
автора тем что работаешь не с таблицами БД, а с объектами языка программирования и не ломаешь голову о том как и какие запросы нужно делать, все это делает какая-нить служба persistent manager сервера приложений.
самое лучшее преимущество - это то, что не нужно учить правила проектирования БД и SQL (и возможно кое где менять взгляды на жизнь), а делать приложения на привычных классах и получать большую зп только из за того, что сама трудоемкость создания 3-х звенных приложений (особенно на J2EE) повыше будет, чем у 2-х звенок :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724391
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора тем что работаешь не с таблицами БД, а с объектами языка программирования и не ломаешь голову о том как и какие запросы нужно делать, все это делает какая-нить служба persistent manager сервера приложений.

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

Вот по поводу дальнейшего читайте тот топик, на который ссылку я привел.
Могу и тут повторить:

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

авторТакие системы могут иметь множество интерфейсов для работы пользователя, например как графический интерфейс GUI так и веб-интерфейс.
Действительно, без сервера приложений невозможно сделать гуи и веб-интерфейс. Явно у нас где-то он затаился, сволочь

авторИнтерфейсы занимаются только отображением и вводом информации.
Глубокая мысль :)

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

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

В общем - в топик тот вам, в топик. Не надо тут флейма, давайте уж там....

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724403
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ASCRUS

Классно поменял термины! :)

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724422
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спрашивается зачем тогда разработчики пишут сервера приложений???
или вы думаете что у MS asp странички напрямую к MS SQL Server-у обращаются???
или зачем Оракл выпустил Oracle Application Server???

какие именно системы работают без AppServer-а???? пример? форум какой-нить, это для вас система?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724430
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
авторсложность любого ООП-языка на порядки выше любого диалекта SQL, куда естественней, проще и производительней сделать простой селект от таблицы, чем (ёпти!) в цикле по коллекции первичных ключей вызывать геттеры.

с одинаковыми скилс pl/sql developer дороже java developera, если разницу помножить на время то иногда можно и проц второй добавить. какой из этих 2х подходов эфективней решает задача, кое где плюсы 3х звенки перекрывают в разы фишки 2-звенки и наоборот.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724434
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
??? У меня биллинговые системы ПРЕКРАСНО работают БЕЗ сервера приложений.

Пойдет ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724449
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторспрашивается зачем тогда разработчики пишут сервера приложений???
авторили зачем Оракл выпустил Oracle Application Server???
Ну кто их знает. Линукс тоже зачем-то пишут, а сколько его используют? 5% от всех юзеров.

авторили вы думаете что у MS asp странички напрямую к MS SQL Server-у обращаются???
Только не надо трогать asp и подобные системы - здесь нет сервера приложений. Здесь есть технология доступа и обработки.
Или может вы нам покажите, где там в asp.net есть объект который называется "проводка"

авторкакие именно системы работают без AppServer-а???? пример? форум какой-нить, это для вас система?
К предыдущему комментарию!
Не надо переворачивать а? Сначала у вас объекты, которые вы дергаете, потом вдруг на форумы скатились, когда ответить нечего стало.

Это уж вы приведите пример, где нужен сервер приложений. А то на 15 страницах того топика никто так и не смог привести вменяемый пример. Только чур: не косить под дурака со всякими форумами и асп-ами!

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724453
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не мешает среднее звено использовать для чисто утилитарных вещей, типа разграничения доступа, интеграции с внешними системами и т.п. Бизнес-логика спокойно "размазывается" между БД и middle-tier. Естественно, везде нужны специалисты, один малчык, который знает Java, но понятия не имеет о, например, переменных привязки, ничего хорошего не добьётся (верно и обратное). А потом мне поделия таких малчыков эксплуатировать и выискивать косяки...

Требую отставки Президента РФ
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724511
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторТолько не надо трогать asp и подобные системы - здесь нет сервера приложений. Здесь есть технология доступа и обработки.
Или может вы нам покажите, где там в asp.net есть объект который называется "проводка"

мне надо рассказать как в ASP делается доступ к удаленному COM объекту, находящему под управлением сервера приложений????

авторЭто уж вы приведите пример, где нужен сервер приложений. А то на 15 страницах того топика никто так и не смог привести вменяемый пример. Только чур: не косить под дурака со всякими форумами и асп-ами!


не буду приводить примеры где он нужен, могу сказать где он есть:
ERP BAAN V, mySAP ERP 2.0, mySAP SRM,SCM,PDM, PDM Windchill, ERP Oracle Applications, Convera RetrivalWare 8.0 и пр....
это примеры больших систем, а ваши примеры систем на 2х звенной архитектуре?

а насчет форума, я просто не там ударение поставил, посему вы меня не так поняли ))
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724556
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автормне надо рассказать как в ASP делается доступ к удаленному COM объекту, находящему под управлением сервера приложений????

При чем тут COM объекты и asp? Вы чего, товарисч???

авторне буду приводить примеры где он нужен, могу сказать где он есть:
ERP BAAN V, mySAP ERP 2.0, mySAP SRM,SCM,PDM, PDM Windchill, ERP Oracle Applications, Convera RetrivalWare 8.0 и пр....
это примеры больших систем, а ваши примеры систем на 2х звенной архитектуре?

Мало ли где он есть. К тому же это готовые системы, которые лично вы не писали и не пишите (и не нпишите, и я не напишу, сил не хватит :)). Как они написаны - это проблемы этих фирм.

Мы тут говорим ококретных разработчиках конкретных систем - т.е. о нас с вами (я надеюсь :). Вот и ваша цитата: Раньше народ писал клиент-серверный софт и тогда, чтобы им не заморачиваться с отслеживанием на клиенте целостности и непротиворечивости данных в БД использовались триггеры и хр.процедуры. Сейчас софт пишут с использованием 3х- и более звенной архитектуры. Так что приводить примеры систем, которые пишут компании с многомиллионными бюджетами и тысячами программеров неуместно. Мало ли кому богатому чего взбредет в голову. На Бугатти может позолоченные педали ставят - что, и нам тоже это делать?

Да и кстати, был вопрос: приведите пример, где нужен сервер приложений . Где нужен , а не где есть . У нас в стране вот ГосДума тоже есть, а не нужна. :) Так что не уходите от темы. Или скажите прямо, что не можете найти преимуществ и примеров надобности апп-сервера не знаете. Мы простим и отпустим с миром

ЗЫ Что за манера в последнее время на форуме: переворачивать вопросы и отвечать неизвестно на что........

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724578
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну если вы не знаете какое отношение ASP имеет к COM технологии, то вообще о чем мы говорим? )))))))

а насчет сервером приложений, то мы при разработке используем Sun One Application Server и пишем под него EntityBeans, и при этом мы не являемся ни Ораклом, ни MS.

Ну а насчет преимуществ слишком долго и муторно объяснять, точно также как долго объяснять преимущество ООП над процедурным программированием, а процедурного программирования над линейным.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724608
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а насчет преимуществ слишком долго и муторно объяснять, точно также как долго объяснять преимущество ООП над процедурным программированием, а процедурного программирования над линейным.

Э, батенька, вы нам баки не забивайте! не бывает пуль серебряных, способных завалить вурдалака. И не бывает также весчей, которые "адназначна луцше" чем остальные.
ООП? рулезно, но не всегда надо... и не всегда быстро... и не всегда прозрачно... хотя во многих случаях удобно.
зато процедурное программирование - быстро, четко, ясно... не заморачиваемся с классами, методами, наследованиями... никаких накладных расходов... просто здорово!
а еще ниже спустится... дык оказывается, что быстрее (в смысле времени выполнения) не вызывать подпрограмму (и, следовательно, выделять место в стеке, чистить стек и всё такое), а 2 (или даже больше) раз повторить один и тот же код явно.
так шта... не бывает пуль серебрянных...

2Тигра
Сервер приложений? Ну, наверное, информационно-поисковая система какая-нито... ты к серверу идешь, запросец даешь... сервер лезет к нескольким СУБД, получает результаты, систематизирует, убирает лишнее, красиво оформляет и отдает тебе.


Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724634
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 locky

Дык любой веб-проект можно назвать сервером приложений.
Но только он им не является в том смысле, в каком мы тут разговариваем :)

savage79ну если вы не знаете какое отношение ASP имеет к COM технологии, то вообще о чем мы говорим?

Я не понимаю, какое отношение имеет asp и com к серверам приложений, вашим объектам "счет" и "проводка" и вашему Sun One Application Server

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724656
andsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tygra приведите пример, где нужен сервер приложений.
Я сейчас пишу сервер приложений, C#, MS SQL2k.
Можно ли в программе обойтись без него? - Я думаю можно, но сложно.
Этот сервер приложений реализует всевозможную бизнес-логику, показывает одни и те же данные на разных языках (разумеется после перевода переводчиком), причем для переключения между языками нужно в клиентской программе только поменять значение одной переменной - остальное сервер приложений сделает сам, используется одновременно и веб-клиентом и обычным Windows Forms клиентом, реализует довольно сложную систему разграничения доступа, использует очереди транзакций, обслуживает ~10000 пользователей. Можно ли сделать все это без сервера приложений, на хранимых процедурах? - Я думаю да, можно. Но это будет намного сложнее.
К возможным замечаниям что я использую сервера приложений потому что плохо знаю TSQL:
может на sql.ru и есть несколько человек кто знают TSQL/MSSQL лучше меня, но их точно немного. С системами где все построено на ХП и на вьюшках я работал, в одной из систем было более 2000 ХП, несколько сотен из них было написано мною. Я могу сравнивать то и другое - потому что работал и с такой архитектурой и с другой. А кто из критикующих сервера приложений, многозвенки, серьезно работал с многозвенками?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724721
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожно ли сделать все это без сервера приложений, на хранимых процедурах? - Я думаю да, можно. Но это будет намного сложнее.
Если сложную логику на ХП, написанных на Java или с хранением Java-обьектов в полях таблиц и прямой с ними работе в SQL, то мне кажется сложность в использование СУБД падает, хотя я такие крупные системы честно скажу не писал и судить так сразу сложно. По идее наверное можно на чистом РСУБД реализовать, мне кажется в данном случае при таких нагрузках как раз Оракл или DB2 вполне подошли бы (если было бы не 10 000 подключений, то и на ASA наверное чего нибудь получилось).
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724779
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну в принципе я сейчас - приобретя такой опыт работы, какой есть - не вижу никаких сложностей и для разработки такого через СУБД.

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

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724808
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, какой всё знакомое усё становится....
де-то я такое слышаль....
токо там сравнивали орацл и мс сиквель....
Так как писать? с сервером приложений или без? на орацле или эм-эсе?

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

Кому нравится арбуз, а кому - свиной хрящик.

Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724879
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSЯ бы сказал, что производительность и эффективность триггеров наверное даже больше не от СУБД зависит, а от драйвера "ПрямыеРуки.sys" :)

Нет, далеко не всегда. Правда, оговорюсь - не во всех СУБД.
Например, в MSSQL и Sybase ASE есть случаи, когда UPDATE только из-за наличия триггера на изменяемую таблицу становиться отложенным или непрямым (т.е. выполняется по более медленным алгоритмам). Связано это с необходимостью сгенерировать псевдотаблицы INSERTED и DELETED. И программист тут ничего поделать не сможет, хоть его убей.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724891
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по-моему в любом случае глупо работать с данными на процедурном языке
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724893
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuperпредставители новых технологий, ответьте представителю устаревших!

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

SergSuper
допустим есть таблица проводок, добавление/удаление/модификация записей должна вызывать изменение в таблице остатков. На другой уровень (с сервера на клиента или промежуточный уровень) выносить нельзя - должно быть в одной транзакции.


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

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


Ну да , без триггеров. У нас например вообще ни одного триггера нет - и ничего, как-то наши проводки хорошо себя чувствуют.

Эта, кругозор-то техницский расширяйте, я вот могу представить реализацию проведения проводок на триггерах (даже сам писал-с), представьте и вы, что без триггеров очень даже жить можно.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724903
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут типа буду пытаться быть объективным...

savage79
а тем что работаешь не с таблицами БД, а с объектами языка программирования и не ломаешь голову о том как и какие запросы нужно делать, все это делает какая-нить служба persistent manager сервера приложений.

Ну, положим, это не преимущество трехзвенки, а преимущество этого самого
persistent manager, а его и в двухзвенке можно использовать очень запросто.

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


Увы , это все не достаточные условия для реализации системы на трех звеньях. Все это вполне делается и на двух. Я бы сказал не так - 3 звена нужны, когда есть сложные процессы, которые должны быть реализованы в системе, сложные алгоритмически, и для которых нужно использовать какие-то языки, отличные от SQL.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724911
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Э, новый тред что ли открыли бы, а ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32724924
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Триггера появились в СУБД ДО появления поддержки декларативной ссылочной целостности.

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

MasterZiv
Можно вместо DML вызывать процедуру.

Что угодно, только не это. БД вообще предназначена для многих программ и их авторы не обязаны знать о каких-то там процедурах вместо DML. Но используя DML они не должны нарушить целостность БД, а так же операций, которые проектировщик БД считает обязательными. Например, автоматическое заполнение вычисленимых полей. Знание же DML как DL от них можно требовать. Зачем изобретали язык БД? Разве не для того, чтобы его все использовали? А о триггере им знать ничего не надо - он сам напомнит о себе. Представляете, что проги-клиенты от производителя СУБД ничего не знают об этих процедурах вместо DML, зато нарушить DML они не могут - это СУБД гарантирует и оно же гарантирует срабатывание триггера.


MasterZiv
Тогда никаких событий не нужно. Все то же самое можно сделать и в процедуре.

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

MasterZiv
Процедура имеет нормальную и гибкую логику работы ( в отличие от триггеров, работа которых должна быть согласованной с основной модификацией данных, производится ТОЛЬКО внутри транзакции и т.п.).

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

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

Для этой цели СУБД имеет специальные средства: представления, синонимы, систему прав. Кроме того, опять триггер - особая, но процедура.



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

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



savage79
Согласен что для современных систем триггеры и прочая фигня, вполодь до ссылочной целостности зачастую уже и не нужно. Объясню почему. Раньше народ писал клиент-серверный софт и тогда, чтобы им не заморачиваться с отслеживанием на клиенте целостности и непротиворечивости данных в БД использовались триггеры и хр.процедуры. Сейчас софт пишут с использованием 3х- и более звенной архитектуры, где вся бизнес логика сосредоточена на сервере приложений, который и отвечает за работу с данными.

Еще до того как народ раньше писал клиент-серверный софт, другой народ писавший еще раньше софт для БД пришел к выводу о целесообразности хранить вместе с данными информационную модель данных. Это обеспечивает независимость данных от любого софта - любого звена. Ограничения целостности, в частности, такая фигня как ссылочная целостность относятся к этой модели. Ее нет смысла переносить в логику приложения любого звена.
Конечно, часть ХП выполняет в БД прикладную роль и может ее функционал имеет смысл перенести на промежуточный сервер. Но в общем случае БД должна жить и после окончания жизненного цикла ИС. Да и не обязательно с ней должна работать только одна прога средего звена. Т.е. многозвенка не отменяет важности независимости данных от приложения, хранения модели данных вместе с данными, ограничений целостности и в том числе, реализуемых с помощью триггеров.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32725013
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 savage79

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

Ну программист пошел, вообще ничего не знает. Не в курсе, что есть целая наука под названием "линейное программирование", что эта наука ни к ООП-у, ни к процедурному ни к функциональному программированию не имеет вообще никакого отношения. Хотя звучит красиво, а главное наукообразно и загадочно.

"На Эллочку вещь произвела такое же неотразимое впечатление, какое производит старая банка из-под консервов на людоеда Мумбо-Юмбо. В таких случаях людоед кричит полным голосом, Эллочка же тихо застонала:
-- Хо-хо!" (C)

Это к слову.

Вот ссылка для любителей красивых словосочетаний (Решение оптимизационной задачи линейного программирования): http://www.bolshe.ru/book/id=1145&page=0

Можно найти и лучше, но чтоб получить понятие о чем речь и эта сойдет.

2 andsm

> Этот сервер приложений реализует всевозможную бизнес-логику, показывает одни и те же данные на разных языках (разумеется после перевода переводчиком), причем для переключения между языками нужно в клиентской программе только поменять значение одной переменной - остальное сервер приложений сделает сам, используется одновременно и веб-клиентом и обычным Windows Forms клиентом, реализует довольно сложную систему разграничения доступа, использует очереди транзакций, обслуживает ~10000 пользователей. Можно ли сделать все это без сервера приложений, на хранимых процедурах? Я думаю да, можно. Но это будет намного сложнее.

А Вы сравнивали? Откуда такая уверенность, что будет сложнее? Если утверждаете, что сравнивали, то наверное сможете пояснить за счет чего в SQL сервере будет сложнее. Например, какие специфические механизмы имеются у аппликейшн сервера (т.е. у среднего звена), которые позволяют обойтись НАМНОГО меньшим количеством объектов (функций, сохраненок), и НАМНОГО меньшим количеством кода? Я думаю всем будет интересно послушать.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32725045
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
2c127

авторНапример, какие специфические механизмы имеются у аппликейшн сервера (т.е. у среднего звена), которые позволяют обойтись НАМНОГО меньшим количеством объектов (функций, сохраненок), и НАМНОГО меньшим количеством кода?

дайте пример и спорим на пхп кода будет минимум в 3 раза меньше :), да-да на пхп. понятно что логика на пхп глупо но посмотрите что он умеет делать с масивами (эфективность мы не обсуждаем) + нетипизирован, там кода не нада, почти все решается функциями языка и кострукцией foreach.
фишка языка субд совсем не в объеме кода, а в эфективности.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32725057
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Yo!

>дайте пример и спорим на пхп кода будет минимум в 3 раза меньше :)

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

>фишка языка субд совсем не в объеме кода, а в эфективности.

В объеме кода тоже. Тем более что в оригинале было: " andsm> Я думаю да, можно. Но это будет намного сложнее. " Ни о какой эфективности, кроме эффективности программирования, речь не шла. Но эффективность программирования тоже напрямую зависит от объема кода по известному эмпирическому правилу, что программист пишет примерно одинаковое число строк в час незавсимо от языка.

Что касается foreach в пхп, так в PL/SQL даже такой оператор есть, если мне память не изменяет. С множествами работать часто не менее удобно чем с массивами, а тут с SQL-ем никто не сравнится. Используйте таблицы вместо массивов.

Я не спорю, наверное есть задачи, где трехзвенка даст некоторый выигрыш. Но во-первых - не в разы, а на проценты, а во-вторых трехзвенка совсем не такое универсальное решение, как о ней говорят. Это ИМХО. Все-таки интересно послушать аргументы сторонников трехзвенной архитектуры.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32725119
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример задачи где хотелось бы чтобы 1С 7.7 была трехзвенной и для чего нужны сервера приложений работающие круглые сутки и обслуживающие запросы пользователей и др. информационых систем.

Нужно было мне делать резервирование материалов на складе технологами из сторонней системы, не запуская 1С-ку. Т.е. системы должны были быть интегрированными. При этом система технологической подготовки производства (ТПП) должна была обращаться к данным 1С-ки и выполнять нужные операции резервирования. Если бы был сервер приложений в 1С-ке с открытым API интерфейсом, к которому можно подключиться и вызывать нужные функции то проблем не было-бы. Запускать при каждой операции экземпляр 1С-ки как COM объект и вызывать из него функции - слишком больши накладные расходы. Пришлось напрямую лезть в БД на MSSQL и смотреть структуру таблиц, что не является документированной возможностью системы. Вот весь и гемор.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32725128
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
c127
Ну программист пошел, вообще ничего не знает. Не в курсе, что есть целая наука под названием "линейное программирование", что эта наука ни к ООП-у, ни к процедурному ни к функциональному программированию не имеет вообще никакого отношения. Хотя звучит красиво, а главное наукообразно и загадочно.

Не судите строго. я может быть просто назвал неправильно - "линейное", но я имел ввиду программирование без использования процедур. Т.е. классический BASIC, где стоки кода имели номера и переходы выпонялись оператором GOTO. )
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32725288
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savage79 Если бы был сервер приложений в 1С-ке с открытым API интерфейсом, к которому можно подключиться и вызывать нужные функции то проблем не было-бы.
А если были нужные процедуры на SQL-сервере - чем это было бы хуже?

MasterZivЭта, кругозор-то техницский расширяйте, я вот могу представить реализацию проведения проводок на триггерах (даже сам писал-с), представьте и вы, что без триггеров очень даже жить можно.
Попробую представить. Получается вместо одного триггера надо писать некие функции, которые будут генерить скрипты, причем раз проводки могут вставляться из разных мест, в каждом это надо будет учесть. Соответсвенно надёжность падает, объём работы увеличивается. Ради чего? Чтобы на несколько процентов быстрее работало?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32725294
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
авторНо эффективность программирования тоже напрямую зависит от объема кода по известному эмпирическому правилу, что программист пишет примерно одинаковое число строк в час незавсимо от языка.

думаешь ? а мне что-то подсказывает что если 100 юзеров начнет колбасить гигабайтные массивы на пхп то радости от кол-ва строк станет немного меньше :)

авторЧто касается foreach в пхп, так в PL/SQL даже такой оператор есть, если мне память не изменяет. С множествами работать часто не менее удобно чем с массивами, а тут с SQL-ем никто не сравнится. Используйте таблицы вместо массивов.

SQL ни куда не денется реч о процедурных расширених pl/sql, t-sql и т.п. помнится была веселая байка про перл
perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
:)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32725459
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
к стате примерчик: select client, date, count(*) from table group by client, date
берем на пхп:
Код: plaintext
1.
2.
3.
4.
5.
6.
parse()
execute()
$marray = array();
while ($row = $rs->fetch()) {
        $marray[$row["client"]][$row["date"]] = $row["count"] ;
}

в результате у меня масив клиентов, в нем масив дат со значниями count в 3 строчки ...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32725838
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом случае в настоящее время триггера позволяют реализовать ограничения целостности, которые не поддерживаются декларитивно в данной версии СУБД, хоть целостности, хоть на значения. И первые и последние могут

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

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

А я скажу наоборот - БД вообще не обязана знать о каких-то там программах, которые ее используют. У меня требования бизнеса поменялись - я структуру базы поменял. Ну что на это скажете ?

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

Ага, и что этот триггер сделать успеет ?
printToLog ("Опаньки ...")
Смешно.

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

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

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


Для этой цели СУБД имеет специальные средства: представления, синонимы, систему прав. Кроме того, опять триггер - особая, но процедура.

Они , увы , имеют ограничения. Те же VIEW не всегда могут быть изменяемы, например.

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

Да Оракл просто крут!! И при чем здесь модификация данных и триггера ? Это не триггер вообще, это просто фича по событию. В Sybase ASE это кстати и триггером-то не называется - "порог" она называется.


Ее нет смысла переносить в логику приложения любого звена.
Конечно, часть ХП выполняет в БД прикладную роль и может ее функционал имеет смысл перенести на промежуточный сервер.

Да нет, при вашем-то подходе уж любая ХП должна только чисто прикладную роль выполнять. У вас же целостность - в триггерах, ограничения - там же, что ж процедурам-то останется ? Вот эту-то логику и логично на сервер приложений, тем более ежели она какую-нибудь например математику серьезную использует, которую на PL/SQL накладно реализовывать будет.

Но в общем случае БД должна жить и после окончания жизненного цикла ИС.

Это как это ? После окончания своей эксплуатации она еще жить должна ? Зачем ? Все, эксплуатации-то нет.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32725945
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему нельзя категорично высказываться, что нужно, а что нет. Все нужно, если использовать с умом. У меня в проекте, например, все таблицы, хранящие входящие данные, обвешаны триггерами, контролирующими их изменение согласно бизнес-логики ТЗ. И тут много плюсов:
1. 100% гарантия, что данные соотвествуют определенным правилам
2. Последний рубеж теста клиентского приложения и ХП, где ошибочные действия клиентской части не могут привести к порче данных, причем получая ошибку от БД, уже понятно, что в клиенте ошибка. Плюс полезно при сложных проверках - когда легче на клиенте их не делать, а оставить их делать самой БД.
3. Упрощение схемы сохранения измененных данных клиентом. Ну зачем спрашивается мне на примитивные изменения таблицы (добавить, изменить, удалить) плодить ХП, когда тот же PB эти инструкции автоматом может генерить ? ХП у меня используются для проведения изменения информации только для "тяжелых" случаев, когда нет однозначного понятия, как изменяемая информация будет вноситься в БД (например, изменение информации закрытого периода приведет к добавлению новой записи в таблицу с новой датой актуальности).
4. Расширенная система грантов - одно дело разрешить пользователю менять/не менять таблицу. Другое дело, когда ему принадлежит только часть таблицы (например те записи, для которых он является хозяином).
5. Возможность реализации пользовательских блокировок (когда например клиентское приложение открыло на изменение информацию и добавила через собственный механизм блокировку на запрет открытия для изменения этой информации другим клиентским приложениям). Правда оговорюсь, такое можно реализовать не на всех СУБД.

На ХП же у меня реализована сложная логика сохранения изменения информации (которая именно решает, что и куда писать, а уж проверяют триггера). Плюс весь расчет зарплаты и отчетности, естественно на таблицах, хранящих результаты расчетов никаких уже триггеров (да и ограничений) нет, тут правила хранения в них информации четко реализуют расчетные ХП и одним из главных показателей работы с ними является скорость чтения/записи в них.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32726183
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Тоже самое позволяют и процедуры. На кой мне эти триггера, если их сложнее писать, у них извращенная логика работы и т.п. ?

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

>А я скажу наоборот - БД вообще не обязана знать о каких-то там программах, которые ее используют. У меня требования бизнеса поменялись - я структуру базы поменял. Ну что на это скажете ?

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

>Ага, и что этот триггер сделать успеет ?
printToLog ("Опаньки ...")
Смешно.

Успевали-с, однако. Известит прогу в далеком городе, в общем случае.

>Как это не может, если уже проигрывает. Он, извините, в транзакции работает.
И только в транзакции. Так что например задача аудита неудачных попыток изменить данные уже практически неразрешима без сторонних системных средств
.

Не только разрешима, но и разрешалась конктетно. Я для одного проекта сделал триггерный аудит. Впрочем теперь, он легко настраивается на любую БД.
Это было по требованию Китайцев, которые изменение этих данных объявили преступлением, в силу их нравов. Кто, что на что и когда изменил - там записыается. Все тесты удачны - кто-то меняет на другом компе, а ему говорят, что и на что он изменил и с какого компа и под каким юзером ОС.

>Они , увы , имеют ограничения. Те же VIEW не всегда могут быть изменяемы, например.

Опять, есть специальные триггеры, которые их могут изменить.

>Да Оракл просто крут!! И при чем здесь модификация данных и триггера ? Это не триггер вообще, это просто фича по событию. В Sybase ASE это кстати и триггером-то не называется - "порог" она называется.

Уточнимся что есть триггер - это особая процедура, которая вызывается на события в БД, связанные с изменением ее состояния. Я это имел в виду. Так и в лит-ре, особенно всязанной с Ораклом. А Вы только те процедуры, которые на модификацию данных реагирует? Уточните, пожалуйста.

>Да нет, при вашем-то подходе уж любая ХП должна только чисто прикладную роль выполнять. У вас же целостность - в триггерах, ограничения - там же, что ж процедурам-то останется ? Вот эту-то логику и логично на сервер приложений, тем более ежели она какую-нибудь например математику серьезную использует, которую на PL/SQL накладно реализовывать будет.

Но я говорил и о том, что ХП могут вызываться из тела триггера. Это связвно и со стилем (структуризация) и разделением задачи на подзадачи и с рекомендациями по ограничению триггера в конкретой СУБД.
В общем случае могут быть процедуры реализующие задачи связанные с БД, например, с репликацией, системой сообщений и др.
Но разумеется часть ХП реализует серверную часть приложения.

>Это как это ? После окончания своей эксплуатации она еще жить должна ? Зачем ? Все, эксплуатации-то нет.
В силу ценности данных самих по себе. Даже существует юридическая защита БД самих по себе, не в связи с остальной частью ИС. Тем более, и Вы выше упомянули, что БД нет дела до прог, которые с ней работают, т.е. они имеют собственную ценность. Их можно использовать с помощью других прог для извлечения информации. А зачем - это уже дело потребителей инфы. Важно, что это одно из достоинств БД.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32726904
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но триггера это тоже процедуры и от того мало отличаются от других процедур и в сложности и в логике.


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


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


У меня была таблица A. В ней было поле f1. Я взял и перенес это поле в таблицу B. Как триггер или констрейнт мне обеспечит, чтоб приложение работало бы как ни в чем не бывало ?


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


!!! ... аудита неудачных попыток изменить данные ...!!!
Ну и как делали ?

Опять, есть специальные триггеры, которые их могут изменить.
Это что это за специальные триггеры ? На View INSTEAD в MSSQL ? Эта - исключение. Эта хороший триггер, единственный из всех, с которым я гатов
мириться. Но кто его поддерживает кроме MS ?

Уточнимся что есть триггер - это особая процедура, которая вызывается на события в БД, связанные с изменением ее состояния. Я это имел в виду. Так и в лит-ре, особенно всязанной с Ораклом. А Вы только те процедуры, которые на модификацию данных реагирует? Уточните, пожалуйста.

Не, не катит такое определение. Триггер - это то, что создается оператором
CREATE/ALTER TRIGGER.

Их можно использовать с помощью других прог для извлечения информации. А зачем - это уже дело потребителей инфы.
Это и есть эксплуатация, или я что-то не понимаю ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32726962
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Ты не понял что ли ? Уж сколько раз говорю - триггера сложнее простых процедур. У них должна быть определенная логига, навязанная

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

>У меня была таблица A. В ней было поле f1. Я взял и перенес это поле в таблицу B. Как триггер или констрейнт мне обеспечит, чтоб приложение работало бы как ни в чем не бывало ?

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

>!!! ... аудита неудачных попыток изменить данные ...!!!
Ну и как делали ?


В том случае УДАЧНЫХ попыток - таково требование заказчика. Кто-то меняет данные. На событие измнения данных срабатывает триггер, и записывает в аудитные таблицы то, что было до изменения и то, что стало после, и то кто с какого компа и когда это сделал. В Оракле триггерный аудит (опять когда стандартного не достаточно) обычное дело. А они там уже могут поднять сведения и принять решение о правомерности этих исправлений. Но это уже их дело. Было требование - оно выполнено. И что, наверное, имеет значение в свете "процедур вместо DML", я совсем не интересовался ни самой БД, ни другими ХП, ни триггерами, ни тем какие приложения и как меняют эти данные. Более того, я написал ХП, которая создает эти триггера и схему аудита. Админу только остается заполнить имена таблиц, отметить поля, и запустить ХП, которая создает триггера, которые Вы говорите якобы сложные. Т.е. пишет их текст в зависимости от имен табл и столбцов и компелит. Иными словами работает и в другом проекте, не обращая внимания на детали реализации его БД. Так и получилось - другой заказчик выдвинул такое же требование. И тратить время на задание не пришлось. А у нас этих заданий выдается по нескольку - поэтому снижение времени на выполнение каждого задания актуально. А Вы говорите выкинуть их. Нет уж лучше подождать с этим.

>Это что это за специальные триггеры ? На View INSTEAD в MSSQL ? Эта - исключение. Эта хороший триггер, единственный из всех, с которым я гатов
мириться. Но кто его поддерживает кроме MS ?


Оракл - триггер INSTEAD OF.
Если Вы готовы мириться с этим, то зачем останавливаться? Ведь тогда не замкнутость - на одни события модификации данных есть триггера, на другие - нет. Стиль не очень гладкий получится.

>Не, не катит такое определение. Триггер - это то, что создается оператором
CREATE/ALTER TRIGGER.


Во-первых, все триггеры, о которых я говорил создаются/модифицируются в Оракле операторми CREATE/ALTER TRIGGER. Во-вторых, это всего лишь реализация в языке БД. Т.е. отвечет на вопрос КАК. А то определение пытается ответить на вопрос ЧТО. В конце концев в разных языках реализация может быть разной этого ЧТО. Поэтому Ваше определение тоже имеет недостатки.

>Это и есть эксплуатация, или я что-то не понимаю ?

Если и эксплуатация то только БД, а не ИС ядром, которой она была в свое время. Т.е. все другие эленменты, в общем случае включая СУБД не имеют значения. Формально достаточно, что кто-то может использовать эти данные для принятия решения даже однократно. А может в другой ИС, но с той же СУБД не важно.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727029
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 savage79

> Не судите строго. я может быть просто назвал неправильно - "линейное", но я имел ввиду программирование без использования процедур.

Я так и понял.

> Т.е. классический BASIC, где стоки кода имели номера и переходы выпонялись оператором GOTO.

Кстати в том бейсике (GW-BASIC на PC) еще были операторы go sub и return, если не ошибаюсь. Так что подпрограммы там были. В них не было параметров. Подпрограммы были даже в Б3-34, тоже без параметров. Наверное привести пример аппликативного языка программирования без подпрограмм довольно сложно, по крайней мере я такого не знаю.

Yo!

> думаешь ? а мне что-то подсказывает что если 100 юзеров начнет колбасить гигабайтные массивы на пхп то радости от кол-ва строк станет немного меньше :)

Я как раз считаю, что на пхп такого делать не нужно. Но в конечном счете все упирается не в производительность машин и программ, а в производительность программистов. По известному эмпирическому правилу 10-90: 10% кода занимает 90% времени работы компьютера, только эти 10% и нужно (да и то не всегда) оптимизировать на производительность. Оставшиеся 90% - тупой программистский труд, ИМХО гораздо важнее уменьшать эту часть ибо она занимает ~90% времени разработки. Поэтому утверждение "andsm>Можно ли сделать все это без сервера приложений, на хранимых процедурах? - Я думаю да, можно. Но это будет намного сложнее." мне кажется актуальным. Вот только вопрос, верно ли оно.

> SQL ни куда не денется реч о процедурных расширених pl/sql, t-sql и т.п.

Никогда с этим не спорил. Процедурные расширения есть и неплохо себя чувствуют. Но мы ведь начали с того что на аппликейшн сервере почему-то получается значительно проще чем в SQL сервере даже с учетом ХП и триггеров. Почему?

> к стате примерчик: select client, date, count(*) from table group by client, date
берем на пхп:

parse()
execute()
$marray = array();
while ($row = $rs->fetch()) {
$marray[$row["client"]][$row["date"]] = $row["count"] ;
}
в результате у меня масив клиентов, в нем масив дат со значниями count в 3 строчки ...


Если не ошибаюсь, ты сказал, что на пхп получится не в 3 раза больше, а в 3 раза меньше. Или я чего-то не понял?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727041
s79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s79
Гость
MasterZiv
!! ... аудита НЕУДАЧНЫХ попыток изменить данные ...!!!
Ну и как делали ?

И не надо так орать:). для Oracle решение это: триггеры на строку(для детальности) и автономные транзакции (pragma autonomous_transaction) . Собственно рецепт: Т.Кайт. "Автономные транзакции
Oracle поддерживает INSTREAD OF
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727244
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые! Ответьте пожалуйста на один вопрос - что такое целостность, ссылочная целостность, декларативная целостность ? И чем все эти понятия отличаются от согласованности ? Мне кажется между этими двумя терминами - целостность и согласованность - огромная разница. Целостность реализуется через FK/PK. Согласованность - гораздо более емко понятие. Реализуется триггрерами и check constraint. И в этом отношении SQL в Sybase ASE, MS SQL очень сильно уступает Oracle, DB2, Sybase ASA, PosgreSQL и куче других баз.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727603
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
автор
Если не ошибаюсь, ты сказал, что на пхп получится не в 3 раза больше, а в 3 раза меньше. Или я чего-то не понял?

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


авторОставшиеся 90% - тупой программистский труд, ИМХО гораздо важнее уменьшать эту часть ибо она занимает ~90% времени разработки.

а язык он не на размер кода заточен, а на задачи. такое впечатление что ты про перл ничего не слышал. на нем решение любой задачи будет занимать меньше кода, там просто там одна проблемка write fast, read slow.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727608
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2MasterZiv
Неудачных попыток? т.е тогда, когда в триггере идет rollback?
давайте попробуем представить...
MS SQL 2000
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create trigger au on authors for update
as begin
 declare @tbl table(id int,name varchar( 512 ))
 insert into @tbl(id,name) select id,name from deleted
 rollback tran
 insert into AuditTable(id,name) select id,name from @tbl
end
несколько некошерно, конечно, но тем не менее данные благополучно переживают откат транзакции, так шта...

Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727683
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще можно вынести в отдельную БД, подключить ее через удаленный сервер и сделать соотвествующие в ней ХП. Так же события помогают (если они есть конечно) - вызываешь событие из триггера, далее оно уже в своей сессии работает и никому не мешается.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727732
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 locky
В MS SQL стандартными способами это сделать нельзя - триггер прерывается после ролбэка
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727775
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky2MasterZiv
Неудачных попыток? т.е тогда, когда в триггере идет rollback?
давайте попробуем представить...
MS SQL 2000
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create trigger au on authors for update
as begin
 declare @tbl table(id int,name varchar( 512 ))
 insert into @tbl(id,name) select id,name from deleted
 rollback tran
 insert into AuditTable(id,name) select id,name from @tbl
end
несколько некошерно, конечно, но тем не менее данные благополучно переживают откат транзакции, так шта...

Posted via ActualForum NNTP Server 1.0

Честно говоря я х..ею от такого кода...
вопрос, а что было с данными, которые изменились до выполнения триггера?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727776
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, не понимаю чем они сложнее.

В транзакции они работают ? Не в транзакции не могут ?
Правила откатывания/принятия транзакций есть ?
Надо это все прописывать ? Надо. Ну и что , не сложнее они ? Сложнее.
Да в вашем оракле еще и нет FOR ALL ROWS триггеров, а то и еще сложнее были бы.
Третий (или четвертый) раз повторять не буду.

У меня была таблица A. В ней было поле f1. Я взял и перенес это поле в таблицу B. Как триггер или констрейнт мне обеспечит, чтоб приложение работало бы как ни в чем не бывало ?

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

А неформально - юзерам работать нада, панимаишь ???
Я им что, скажу что типа "Фармально вы уже работать не можите, так что фсе!!"

>!!! ... аудита неудачных попыток изменить данные ...!!!
Ну и как делали ?


В том случае УДАЧНЫХ попыток

Я говорил про НЕУДАЧНЫЕ. С удачными все просто и ясно.

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

Стиль - нично. Жажда - фсе.

Во-первых, все триггеры, о которых я говорил создаются/модифицируются в Оракле операторми CREATE/ALTER TRIGGER.

Если это еще и в стандарте пропишут - тогда я изменю свое определение.

>Это и есть эксплуатация, или я что-то не понимаю ?

Если и эксплуатация то только БД, а не ИС ядром

В другой, не в другой, с, без - это эксплуатация по любому.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727793
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s79
И не надо так орать:).

Парасти, таварисч вот не слышал ...

s79
для Oracle решение это: триггеры на строку(для детальности) и автономные транзакции (pragma autonomous_transaction) .


Ну я и говорил, что без использования спец. системных средств или возможностей СУБД это невозможно.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727805
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>2 locky
>В MS SQL стандартными способами это сделать нельзя - триггер прерывается после ролбэка

from BOL
If a ROLLBACK TRANSACTION is issued in a trigger:

1.All data modifications made to that point in the current transaction are rolled back, including any that were made by the trigger.
2.The trigger continues executing any remaining statements after the ROLLBACK statement. If any of these statements modify data, the modifications are not rolled back. No nested triggers are fired by the execution of these remaining statements.

второй абзац.
2Gardenman
С какими данными? ситуяцию обрисуйте, лучше всего в виде кода.

Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727819
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanУважаемые! Ответьте пожалуйста на один вопрос - что такое целостность, ссылочная целостность, декларативная целостность ?

Это - пять слов.

gardenman
И чем все эти понятия отличаются от согласованности ?

Это - еще одно слово, не совпадающее ни с одним из вышеприведенных пяти.

gardenman
Мне кажется между этими двумя терминами - целостность и согласованность - огромная разница. Целостность реализуется через FK/PK. Согласованность - гораздо более емко понятие. Реализуется триггрерами и check constraint.


gardenman
И в этом отношении SQL в Sybase ASE, MS SQL очень сильно уступает Oracle, DB2, Sybase ASA, PosgreSQL и куче других баз.


Биз базаров, Оракул и Посгрес рулят, асобинна Посгрис.
Эта ващще зверь !!
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727830
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockyдавайте попробуем представить...
MS SQL 2000
create trigger au on authors for update

Ты эта запускать пробывал ? Работаить ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32727880
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Ты эта запускать пробывал ? Работаить ?
А поглядеть (почитать) религия не позволяет?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
if object_id('tmpAu') is not null drop table tmpAU
if object_id('tmpAuAudit') is not null drop table tmpAUAudit
go
create table tmpAU(id int primary key,name varchar( 512 ))
go
create table tmpAUAudit(id int,name varchar( 512 ))
go

insert into tmpAU(id,name) select top  10  id,name from sysobjects order by id asc
go
create trigger trgtmpau on tmpAU for update
as begin
 declare @tbl table(id int,name varchar( 512 ))
 insert into @tbl(id,name) 
 select D.id,D.name+'->'+I.Name from deleted D join Inserted I on D.ID = I.ID
 rollback tran
 insert into tmpAuAudit(id,name) select id,name from @tbl
end
go

update tmpAU set name = name+'!'
go
select * from tmpAu
select * from tmpAuAudit
go

Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32728348
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В транзакции они работают ? Не в транзакции не могут ?
Правила откатывания/принятия транзакций есть ?
Надо это все прописывать ?


В Оракле, как правило, необходимость управлять транзакциями если и возникает (редко встречалась необходимость), то не вызывает таких сложностей, чтобы о оних говорили. Сам не встречал сложностей ни в практике, ни упоминая о них литре по Ораклу. Что-то читал, что вроде в других СУБД посложнее с этим. Т.е. больше вопрос реализации механизма транзакций и поддержки в СУБД, а не концепции самого триггера.. Хорошо, скажем так – отменяйте их, но не в Оракле. С другой стороны не факт, что никогда не надо управлять транзакциями в ХП. Проект с процедурами вместо DML - в общем кажется заведомо более сложным. В большом проекте БД и приложениями занимаются разные люди. Им надо ждать и знать эти процедуры вместо DML, в которых будет то, что должен делать триггер. Ведь это для всех прог обязательно. Процедуры хуже DML - последние не процедурные, являются частью языка БД, лучше стандартизированы, их баги более известны, чем пользовательские процедуры. Тем более если много прог и исключить использования DML – нельзя (например, админами). В том числе и на этапе сопровождения. Просто плохой стиль - излишнее укрупнение и совмещение двух разных языков - ведь в этих процедурах вместо DML внутри будет опять DML? Или вообще отменить язык БД? А потом модель данных и вернуться к плоской файловой модели? Заменить процедурами - обычными прогами типа клиппер?
В общем повторять тоже не буду - что угодно только не это.
Никто не мешает Вам пробовать обойтись без триггеров, но у остальных должна быть и такая возможность.
Есть конечно, что-то чего хотелось бы, и чего нет, но когда это многим надо будет - добавят. Наиболее известная трудность в Оракле (но не преодолимая) связана с запросом в триггере типа FOR EACH ROWS к изменяющейся таблице. Она описана в литре. Наверное, есть и др. недостатки, но недостаточные для отмены триггеров как таковых.

>Да в вашем оракле еще и нет FOR ALL ROWS триггеров, а то и еще сложнее были бы.

Есть триггер уровня инструкций, т.е. не FOR EACH ROWS. Сложность не пугает, зато дополнительная возможность обнадеживает.


>А неформально - юзерам работать нада, панимаишь ???
Я им что, скажу что типа "Фармально вы уже работать не можите, так что фсе!!"


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

>Я говорил про НЕУДАЧНЫЕ. С удачными все просто и ясно.

Т.е. Вы признали, что для УДАЧНЫХ подходит? Или Вы считаете, что если чего-то в данной реализации нельзя с помощью того или иного механизма, то нужно отменить этот механизм вообще? И во всех СУБД? Но судя по тому, что ХП развиваются от версии к версии, то там тоже чего-то не доставало. Да и языки БД развиваются, т.е. раньше чего-то не могли. Что касается НЕУДАЧНЫХ, то их нельзя было в каких-то ранних версиях Оракла (7.) с помощью триггеров, но хотелось. Но обратите внимание, предпочли добавить возможности которые позволяют и это, но не отменили триггера.

>Стиль - нично.
Как посмотреть. Для сопровождения он, может быть, уже кое-что.

>Если это еще и в стандарте пропишут - тогда я изменю свое определение.
Как хотите. Стандарты на западе не обязательны и их может быть несколько. Но тогда можно им пойти с Вами на компромисс - заменить слово триггер на что-то другое, отменить CREATE/ALTER TRIGGER и ввести CREATE/ALTER "Некая процедура, которая вызывается в ответ на событие изменения....". Ведь оределение только опирается на ключевые слова CREATE/ALTER TRIGGER. Возможно учтут Ваше мнение: Дейт против SQL, но они не учли. Но кто знает.

>В другой, не в другой, с, без - это эксплуатация по любому.
Ну, пусть будетэксплуатация БД после окончания жизненного цикла ИС.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32728366
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто в очередной раз большой респект
ASCRUS за http://www.sql.ru/forum/actualpost.aspx?bid=10&tid=7615&mid=0&p=5#1012711
и
gardenman за http://www.sql.ru/forum/actualpost.aspx?bid=10&tid=7615&mid=0&p=5#1014842

imho как раз верные выщи - а не пустая болтовня
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32728541
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
позволю себе еще одно замечание.
ROLLBACK в триггере считаю дурным тоном.
Триггер должен либо выполниться, либо не выполниться, либо вернуть ошибку RASE_ERROR. Триггер - это всего лишь подпрограмма и она может быть вызвана откуда угодно. И решение о том откатывать транзакцию или нет должен принимать caller - вызвавшая процедура.
Когда я в Sybase - овской документации увидел такой пример, для меня на счет Sybase сразу все понятно стало - ламеры..)))
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32728611
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может не до конца понял gardenman но какое такое решение может принять caller если тригер, контролирующий согласованность, считает ситуацию недопустимой?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32728637
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКогда я в Sybase - овской документации увидел такой пример, для меня на счет Sybase сразу все понятно стало - ламеры..)))
Смотря в каком Sybase. В отличие от ASE, в ASA можно просто в триггере сгенерить ошибку через RAISERROR, возбудить исключение через SIGNAL, сделать откат до сохраненной точки через ROLLBACK TO SAVEPOINT или выполнить откат через оператор ROLLBACK TRIGGER, который позволяет реализовать обработку ошибок вложенных триггеров, что в вкупе с поддержкой обработки исключений дает прекрасную возможность гибко реализовывать любую логику работы.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32728855
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman
Уважаемые! Ответьте пожалуйста на один вопрос - что такое целостность, ссылочная целостность, декларативная целостность? И чем все эти понятия отличаются от согласованности? Мне кажется между этими двумя терминами - целостность и согласованность - огромная разница. Целостность реализуется через FK/PK. Согласованность - гораздо более емко понятие. Реализуется триггрерами и check constraint.


Но есть и другая правда. В литературе по БД целостность - удовлетворение данных логическим правилам. Ограничения целостности в (зависимости от литературы): Ограничения уникальности, Ссылочной целостности, Ограничения на значения и Ограничения общего вида - связаны с логической моделью данных. Декларативные - это те, которые могут быть объявлены в схеме как органичения данного вида в данной СУБД. Например, check constraint - ограничение на значение, объявляется явно и поддерживается СУБД. В том числе в словаре БД можно искать декларативные - т.е. они явно описывают модель. И уж точно для их реализации ничего не надо программировать на процедурном (алгоритмическом языке). Однако, поскольку не всегда декларативных возможностей хватает для реализации необходимых ограничений, используются пользовательские (триггерные). Могут быть разные названия в разных источниках. Тогда используется процедурный язык. Т.е. языка БД уже не достаточно. Такие органичения целостности - хуже читаются (модель становится менее читаемой) , поэтому, конечно, декларативные предпочтительнее во всех отношениях, чем триггерные. Другое дело все ли ограничения целостности могут быть выражены с помощью декларативных ограничений? Нет ли другой пользы от возможности запуска процедур на события связанные с изменением состояний БД?
Согласованность данных больше встречается в контексте физических процессов по переходу БД из одного состояния в другое. Транзакция состоит из нескольких операций. Каждая операция внутри транзакции может переводить БД в несогласованное состояние, но транзакция в целом не должна.
Часть данных изменила, а другую не изменила - можно говорить о несогласованности данных. Продолжают они удовлетворять ограничениям целостности или нет - БД не должна находиться в таком состоянии. Кроме того, во время изменнения данных, кто-то другой читает их, и в общем случае может прочитать промежуточные - несогласованные данные.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729003
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Yo!

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

Похоже что действительно не понял, поскольку в том же твоем посте такой зарпос приводится и занимает он одну строчку (select client, date, count(*) from table group by client, date). Конечно можно в установке страницы выставить количествово_строк = 1, тогда ты прав, как раз страница и получается.

> а язык он не на размер кода заточен, а на задачи.

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

> такое впечатление что ты про перл ничего не слышал. на нем решение любой задачи будет занимать меньше кода, там просто там одна проблемка write fast, read slow.

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

Я уже многократно приводил ссылку "The Comparation of 7 Languages" (http://www.osp.ru/os/2000/12/045.htm), там, например, питон не проигрывает перлу по количесву кода, а по лучшему результату даже выигрывает (рис.5). Это доказательство того и так очевидного факта, что все-таки не ЛЮБАЯ задача на перле решается меньшим числом строк.

И все-таки, объяснит кто-нибудь, чем же трехзвенка принципиально лучше классического клиент-сервера?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729009
s79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s79
Гость
MasterZiv И только в транзакции. Так что например задача аудита неудачных попыток изменить данные уже практически неразрешима без сторонних системных средств.]

Начальная фраза.
MasterZivНу я и говорил, что без использования спец. системных средств или возможностей СУБД это невозможно.
Конечная фраза

Пожалуйста не нужно передергивать. Вы утверждали что это можно сделать только сторонними системными средствами. То что вы написали в конечной фразе, это дополнительное условие которое если усложнить можно дописать для Oracle так: тиггер на аудит не используя PL/SQL (т.к. это специальная возможность СУБД ). Всегда стоит рассматривать и учитываь всю полноту возможностей предоставляемых программным средством.
Так что ваше условие необходимости существования хотябы в одном случае триггера выполнено.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729010
s79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s79
Гость
такое впечатление что ты про перл ничего не слышал. на нем решение любой задачи будет занимать меньше кода, там просто там одна проблемка write fast, read slow.

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

Господа давайте не затевать holy war еще и по языкам программирования не относящимся к СУБД.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729131
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
c127
И все-таки, объяснит кто-нибудь, чем же трехзвенка принципиально лучше классического клиент-сервера?
Преимущества буду излагать постепенно.
1.
Трехзвенка например вещь необходимая когда нужно интегрировать несколько информационных систем, тогда сервера приложений могут обмениваться данными в асинхронном режиме например по протоколу SOAP.
При этом БД разных информационных систем (ИС) могут быть под управлением различных СУБД.
Это конечно можно делать и с помощью ХП на Java, но не все сервера БД поддерживают Java, далее это будет выполняться в синхронном режиме, а не асинхронном, что бывает полезно при репликации данных между системами без участия человека.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729247
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuriМожет не до конца понял gardenman но какое такое решение может принять caller если тригер, контролирующий согласованность, считает ситуацию недопустимой?

В принципе ASCRUS ответил правильно. Ошибка в триггере еще не значит, что всю транзакцию нужно откатывать. Все зависит от логики приложения.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729256
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>И все-таки, объяснит кто-нибудь, чем же трехзвенка принципиально лучше классического клиент-сервера?

В зависимости от проекта могут быть разные преимущества.
Но некоторые общие преимущества напрашиваются сами:
Независимость некоторых уровней друг от друга: 1 и 3. Теоретически можно заменить СУБД, а клиентов исправлять не надо - т.е. исправления на серверах приложений и БД.
Вообще если клиенты только интерфейсом занимаются, то при исправлении функционала на среднем уровне опять клиентов исправлять не надо. У нас есть система отчетов (2-звенка) и система WEB (3-звенка Сервер БД, Web-сервер, клиенты) - отчетов. Первую нужно устанавливать вместе с клиентом Оракла на каждый комп клиетского уровня, а на второй можно вообще почти ничего не знать о клиентах.
Это сказывается на сопровождении - этих клиентов может быть очень много или мало, но мерзких - допотопные компы, не известено где стоят, а заглючат не отмажешься, если ты к ним подходил.
Часто клиент - может быть тонким в трехзвенке - дешевле среднего в 2-звенке.
Перерасперделение аппаратных ресурсов между серверами, если трех звенка аппаратная. (Т.е. если WEB сервер и сервер БД на одном компе - это тоже пример трехзвенки, но программной)
Вынесение тяжелого, но не свойственного СУБД функционала на средний уровень.
Многие де факто пользуются так или иначе трехзвенкой, используют, например, WEB сервера, но считают это двухзвенкой. Не знаю почему.
Однако, все это все равно клиент-серверная технолгоия, скорее всего. Так как обработка запросов на сервере. Клиента на промежуточном (сервер приложений), промежуточного (он клиент для сервера БД) на серовере БД.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729414
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vadiminfo
Вообще если клиенты только интерфейсом занимаются, то при исправлении функционала на среднем уровне опять клиентов исправлять не надо. У нас есть система отчетов (2-звенка) и система WEB (3-звенка Сервер БД, Web-сервер, клиенты) - отчетов.
В данном случае это трехзвенка, но без сервера приложений. Более правильно называть трехзыенками системы с серверами приложений. Т.е.
СУБД - Сервер Приложений - Интерфейсы, где интерфейсы могут быть как WEB (в данном случае появляется еще 1звено-вебсервер), так и GUI.

vadiminfo
Вынесение тяжелого, но не свойственного СУБД функционала на средний уровень.

Все верно сказано. Поясню примером.
Система планирования загрузки обрудования для промышленности. Входными данными является техпроцес и БД оборудования, инструмента и присособлений предприятия. Сервер приложений для планирования использует сложные алгоритмы оптимизации и платнирование поизодства обычно идет по расписанию, т.е. этот процесс ресурсоемкий и требует порой значительного времени (например планирование может идти целую ночь).
Понятно что на клиенте это все посчитать сложновато, т.к. ресурсов клиента зачастую не хватит. На сервере БД тоже сложновато будет реализовывать алгоритмы оптимизации. Посему весь функционал переносим на сервер приложений.
Примерами могут служить еще поисковые системы. У них в БД хранятся необходимые индексы. А сама система предаствляет собой сервер приложений со множеством сервисов, которые могут анализировать содежимое множества типов и форматов документов.
Еще пример, системы проектного упраления, когда нужно по определенной очереди задач рассылать пользователям задания, выполнять оптимизацию загрузки ресурсов участвеющих во многих проектах.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729415
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky>Ты эта запускать пробывал ? Работаить ?
А поглядеть (почитать) религия не позволяет?

Ты считаишь, что у всех пользавателей ИНета на компе должен MSSQL стаять?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729521
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>>Ты эта запускать пробывал ? Работаить ?
>>А поглядеть (почитать) религия не позволяет?

>Ты считаишь, что у всех пользавателей ИНета на компе должен MSSQL стаять?
Нет, я так не думаю. Но Вы так живо отреагировали, что я решил: Вы попробовали и у Вас не получилось.

Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729573
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savage79
Более правильно называть трехзыенками системы с серверами приложений. Т.е.
СУБД - Сервер Приложений - Интерфейсы, где интерфейсы могут быть как WEB (в данном случае появляется еще 1звено-вебсервер), так и GUI.


Но можно говорить не о трехзвенках при сравнении с классической двух звенкой, а моногозвенках. Тогда можно сосредоточиться на кол-ве звеньев, абстрагируясь от их деталей. Например, это может быть удобнее при выявлении достоинств и недостатков, связанных именно с количеством звеньев. (В, конце концов, тогда можно будет рассматривать и многозвенки, в которых нет даже сервера БД).
Но классифицировать трехзвенки: одни с сервером приложений, другие с WEB - сервером. И сосредоточиться на их сравнении внутри трехзвенок. Такой подход тоже может иметь свои плюсы.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729693
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, все-же нужно отделять трехзвенки (многозвенки):
1. классические трехзвенки с явно выраженным апп-сервером, клиентом и БД, причем все звенья пишутся программером
2. так называемые трехзвенки на основе веб-сервера, которые являются по сути обычными двухзвенками: программируется только два звена, а броузер является всего лишь другим видом интерфейса - не ГУИ.

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

Хреново выразился, но надеюсь понятно. :)

Да, по поводу независимости от СУБД клиента, который ходит к апп-серверу: это только рекламный лозунг, все-равно придется переделывать или менять апп-сервер. Так какая разница тогда, если я с тем же успехом поменяю вызовы ХП у клиента? Никакой! Сам клиент - интерфейс - не меняется. Зато нет лишнего звена, которое сначала надо еще сделать, потом сделать клиента, который будет вызывать методы апп-сервера - это вместо того, чтобы вызывать ХП или запросы из БД.

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

ЗЫ Никто же не против многозвенок в принципе. Только применение их должно быть по месту :)

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729781
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tygraИ трехзвенка даст только больше мороки, работы и обслуживания.

Почему ты решил что трехзвенка добавит тебе мороки. Ты с ними работал? или тока предполагаешь? Морока для тех кто их не знает.
Обслуживание сервера приложений (AS - appserver) ничуть не отличается по сложности от обслуживания сервера БД. Только зачастую обслуживание сервера БД при наличие AS уже не требуется, т.к. все эти функции встроены в AS, центр администрирования смещается к AS.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729896
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savage79Почему ты решил что трехзвенка добавит тебе мороки. Ты с ними работал? или тока предполагаешь? Морока для тех кто их не знает.
Обслуживание сервера приложений (AS - appserver) ничуть не отличается по сложности от обслуживания сервера БД. Только зачастую обслуживание сервера БД при наличие AS уже не требуется, т.к. все эти функции встроены в AS, центр администрирования смещается к AS.
В понятие обслуживания входит изменение бизнес-логики из за изменения ТЗ. Вот тут то и есть морока для систем, где класс на классе сидит и классом погоняет. Можно как угодно хорошо спроектировать и написать иерархию классов, но все равно копаться в коде ООП не самое интересное занятие. Я думаю все это происходит из за того, что 3-и звенья пытаются обвязать РСУБД обьектным описанием сущностей, что взаимоисключающие понятия. Тут в данном случае даже Cache лучше выглядит, так как ООП просто ложится в его парадигму хранения и обработки данных. У меня лично всегда, когда я вижу связку, где РСУБД хранилище данных, а основные описания структуры и логики реализованны на ООП возникает видение ежа с удавом.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32729922
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОбслуживание сервера приложений (AS - appserver) ничуть не отличается по сложности от обслуживания сервера БД. Только зачастую обслуживание сервера БД при наличие AS уже не требуется, т.к. все эти функции встроены в AS, центр администрирования смещается к AS

Сие наводит на мысль, что у вас в СУБД лежат только таблицы и больше ничего. А зачем тогда СУБД нужна вообще?
Был недавно не менее "прохладный" топик по поводу использования select-ов прямо из клиента (апп-сервера в этом случае) вместо ХП в БД. Очень уж это странно.
И уж намного проще поменять ХП, чем менять код классов в апп-сервере (а потом его компилять, выкладывать .....).
Ну а про администрирование вообще умолчу - или промышленный сервер, или самописная вещь.

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730024
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tygra

Родной, тебе не надоело? Просто интересно, как ты думаешь, что такое appserver - т.е. какие функции он берет на себя?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730086
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да надоело уже, да что ж с вами сделаешь

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

Иначе я даже и не знаю - каков смысл?

А по вашему - что такое апп-сервер?

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730178
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tygra так нечестно - хоть бы глянул одним глазом - что же это за звери такие appserver'а. Для такого бывалого appserver-ненавистника не знать что же такое appserver как-то не солидно

В общем! уважаемые нелюбители "трех-звенок" - не позорьтесь - прочтите хоть раз что такое application server
Tomcat
Sybase EAServer

Если коротко - то это приложение являющееся контейнером компонентов* и предоставляющее для них
- единую систему контроля ресурсов*
- систему управления кластеризацией
- систему управления распределением нагрузки
- систему управления жизненным циклом (создание/удаление/организация пулов и кэшей)
- систему управления развертыванием
- систему разграничения и контроля доступом
- систему для единого администрирования
- и т.д.

При этом под компонентами, в зависимости от платформы, понимается достаточно разные вещи - от servlets/eb в java до com+ компонентов в MS MTS
А под ресурсами - вообще много чего (от транзакций/соединения с БД и т.д.)

Так вот - нетрудно заметить, что к размещению бизнес логики app server'а имеют лишь косвенное отношение

А теперь ответьте на вопрос, tygra и Co, неужели ничего из перечисленного вы никогда не пытались сами добавить в свои приложения?! Неужели все это не интересно и лишено смысла? Так вот - все это уже есть и притом готовое - просто надо выучить и использовать!
PS> я думаю что все эти войны “2х звенщиков” с “много-звенщиками” это просто недостаток IT образования в нашей стране. У нас принято больше полагаться на "гениальность" а не на опыт других людей. Мы не любим использовать то что сделали не мы - обязательно все хочется написать самим. Поэтому у нас и не приживаются ни java ни какие либо другие технологии в которых необходимо вначале очень долго учиться у других - и лишь затем применять. Т.е. здесь не прокатывает вариант "на коленках"
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730260
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во, это уже дело, а то пожар один.... Давайте вместе разбираться, а то может зря все, тушить надо.

авторА теперь ответьте на вопрос, tygra и Co, неужели ничего из перечисленного вы никогда не пытались сами добавить в свои приложения?! Неужели все это не интересно и лишено смысла? Так вот - все это уже есть и притом готовое - просто надо выучить и использовать!
Щас попробую, но я только за себя могу, с остальными так же как и вы только по форуму коллега (пока еще), вместе не работаем.

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

авторЕсли коротко - то это приложение являющееся контейнером компонентов* и предоставляющее для них
- единую систему контроля ресурсов*
Соединения с БД - что именно тут контролировать?
Транзакции - с клиента никогда не применяем, только внутри ХП.
Каких еще ресурсов? Пока это не узнаю, не могу скзать больше ничего...

автор- систему управления кластеризацией
Ну кластеризация.... Если это то, что я думаю, то: В Оракле есть понятие кластера, так что там все и так путем. В MS SQL конечно нет таких кластеров, но в принципе можно и тут сделать. Хотя пока что не понадобилось. А если так сильно понадобится - тогда Оракл.

автор- систему управления распределением нагрузки
Смотря что под этим понимать. Можно кластера понимать под этим. А можно и network load ballansing сверху повесить и пусть распределяет. У нас так веб работает. Хорошая вещь.
Но опять же - нужно ли это когда? И нужно ли это для апп-сервера или для БД?

автор- систему управления жизненным циклом (создание/удаление/организация пулов и кэшей)
Я так понимаю, это относится именно к апп-серверу. А если его нет - нет и вопроса. Или это что-то, имеющееся в двухзвенке?

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

автор- систему разграничения и контроля доступом
Дык... Есть встроенная система прав и доступа у MS SQL, да и у любой СУБД. Есть еще своя система для разграничения доступа к действиям на клиенте. Вот. Зачем мне какая-то другая, на апп-сервере?

автор- систему для единого администрирования
Надо все же расширять понятия: что такое "единое админимстрирование"? Для администрирования СУБД есть свои встроенные средства, как графические так и процедурные. Для администрирования клиента...??? А что там можно администрировать. Только права. Это выше.

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

авторТак вот - нетрудно заметить, что к размещению бизнес логики app server'а имеют лишь косвенное отношение
Вот то-то и оно: где она, бизнес-логика, лежит все-же, в БД или апп-сервер, и если в БД, тем более зачем же апп-сервер тогда нужен, вот этого то я не пойму!
Потому как получается, что мне в двухзвенке ничего такого не нужно - из всего перечисленного у нас либо оно уже есть - само по себе или сделанное, или его у нас нет и не нужно. Вот и получается, что двухзвенка идеально подходит для решения к-с задач.


-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730270
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUS
В понятие обслуживания входит изменение бизнес-логики из за изменения ТЗ. Вот тут то и есть морока для систем, где класс на классе сидит и классом погоняет. Можно как угодно хорошо спроектировать и написать иерархию классов, но все равно копаться в коде ООП не самое интересное занятие. Я думаю все это происходит из за того, что 3-и звенья пытаются обвязать РСУБД обьектным описанием сущностей, что взаимоисключающие понятия. Тут в данном случае даже Cache лучше выглядит, так как ООП просто ложится в его парадигму хранения и обработки данных. У меня лично всегда, когда я вижу связку, где РСУБД хранилище данных, а основные описания структуры и логики реализованны на ООП возникает видение ежа с удавом.
Если для тебе проще реализовывать системы планирования, потимизации и пр., примеры которых я привел выше, на хранимых процедурах - то вперед.
Повторюсь "Система планирования загрузки обрудования для промышленности. Входными данными является техпроцес и БД оборудования, инструмента и присособлений предприятия. Сервер приложений для планирования использует сложные алгоритмы оптимизации и платнирование поизодства обычно идет по расписанию, т.е. этот процесс ресурсоемкий и требует порой значительного времени (например планирование может идти целую ночь)." это проще сделать на ХП или на нормальном языке программирования????! Чтож вы про эти системы все умалчиваете???? а начинаете сваливать на всякую фигню типа "ой, сложности администирования и пр..". В вашем понятии система заключается только в том, как данные в БД записать, и потом оттуда их получить. А пораскинуть мозгами и представить что существует большой класс сложных систем вы уже не можете.

funikovyuri
В общем! уважаемые нелюбители "трех-звенок" - не позорьтесь - прочтите хоть раз что такое application server
Tomcat
Sybase EAServer

Если коротко - то это приложение являющееся контейнером компонентов* и предоставляющее для них
- единую систему контроля ресурсов*
- систему управления кластеризацией
- систему управления распределением нагрузки
- систему управления жизненным циклом (создание/удаление/организация пулов и кэшей)
- систему управления развертыванием
- систему разграничения и контроля доступом
- систему для единого администрирования
- и т.д.

При этом под компонентами, в зависимости от платформы, понимается достаточно разные вещи - от servlets/eb в java до com+ компонентов в MS MTS
А под ресурсами - вообще много чего (от транзакций/соединения с БД и т.д.)

Так вот - нетрудно заметить, что к размещению бизнес логики app server'а имеют лишь косвенное отношение


В общем все верно сказано!, только Томкат позицируется скорее как Servlet & JSP контейнер, а вот сервер по спецификации J2EE это уже настоящий сервер приложений (BEA WebLogic, Sun One Application Server, Borland Application Server, Oracle Application Server и пр...). Хотя к слову сказать, RMI сервер тоже можно назвать сервером приложений.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730275
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлю свой ответ из параллельного топика:

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

Но когда говорится что-то типа: двухзвенка это прошлое, надо все делать на многозвенке; логика вся должна быть в апп-сервере и никогда не в СУБД ... и т.д. - ну это же бред, против этого и шумим :)

Я и сам трехзвенку недавно делал :) - только на основе вебсервисов (.net помогла): вин-клиент (vb.net) идет на вебсеврисы.net, которые идут в БД. В принципе вебсервисы никакой логики не содержат - просто перенаправляют потоки данных и все. Это тот случай, когда больше никак - хотя и не обычная многозвенка, нет тут никакой бизнес-логики в среднем слое, как было в БД, так там и осталось.

Мы не бандиты, мы благородные пираты :)

-- Tygra\'s --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730300
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 savage79

Так у вас каждый юзер может запустить процесс, который: процесс ресурсоемкий и требует порой значительного времени (например планирование может идти целую ночь).

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

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

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730320
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tygra2 savage79

Так у вас каждый юзер может запустить процесс, который: процесс ресурсоемкий и требует порой значительного времени (например планирование может идти целую ночь).

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

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

-- Tygra's --
почитай книжки
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730346
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли для тебе проще реализовывать системы планирования, потимизации и пр., примеры которых я привел выше, на хранимых процедурах - то вперед.
Повторюсь "Система планирования загрузки обрудования для промышленности. Входными данными является техпроцес и БД оборудования, инструмента и присособлений предприятия. Сервер приложений для планирования использует сложные алгоритмы оптимизации и платнирование поизодства обычно идет по расписанию, т.е. этот процесс ресурсоемкий и требует порой значительного времени (например планирование может идти целую ночь)." это проще сделать на ХП или на нормальном языке программирования????! Чтож вы про эти системы все умалчиваете???? а начинаете сваливать на всякую фигню типа "ой, сложности администирования и пр..". В вашем понятии система заключается только в том, как данные в БД записать, и потом оттуда их получить. А пораскинуть мозгами и представить что существует большой класс сложных систем вы уже не можете.
Вот интересно, как крутяться задачи по расчетам зп, кварплаты, схемы энергопотребления промышленных абонентов, где расчет идет по графам на ХП ? И неплохо крутятся, так как SQL в свете динамического SQL еще и выступает для бизнес-логики в качестве встроенного языка, на котором можно не только быстро и красиво описать правила расчетов обьектов (уточню - запросами, а не курсорчиками), но еще и позволяет организовать хранение истории изменения самих алгоритмов во времени (хоть задними числами).

Теперь рассмотрим случай тяжелых алгоритмов, которые явно сложно впишутся в SQL. Естественно они в СУБД не нужны, но относятся ли они к области обработки и хранения данных ? Ни в коем разе. Вот Вы считаете свое планирование, а потом готовые результаты заносите в БД - именно это и есть входящая информация для БД, с которой в ней начинается работа. А расчет - это есть ни что иное, как просто отдельный уровень, отвечающий за сложные алгоритмические действия, и где его реализовывать, это уже вопрос проектировщика. Хотите, реализуйте на клиенте, хотите вынесите COM-сервером и пусть клиент к нему обращается. Если позволяет СУБД, накатайте расчеты на Java или Си, подрубите к БД как расширенные ХП и вызывайте их прямо с SQL. Но к-с система то все равно остается 2-х звенной, не имеет расчетный модуль отношения никакого к взаимоотношениям клиента и сервера и не должен иметь. Думаю Вы знаете, что при программировании правилом хорошего тона является разделять задачу на автономные независимые подзадачи ? Так почему же Вы пытаетесь из за только одного расчета все однотипно запихнуть в сервер аппликаций, беря за планку критерия выбора хранения логики самую сложную - не легче ли для каждой задачи пользоваться предназначенными для этого средствами ? Для обработки информации лучше всего подходит SQL и проектирование логики на ХП и триггерах, для расчетов алгоритмические языки, для интерфейсной части любое RAD средство - так и пользуйтесь по максимуму возможностями каждого, а не пытайтесь выбрать одно и все на него лепить. Как говорится, разделяй и властвуй :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730374
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ASCRUS
Правильно сказал!!! На все сто!

Так что, savage79 , читай книжки ты .
В том числе и правила хорошего тона, переиздание 2004 года прочти, поможет :)

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730406
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tygraВ том числе и правила хорошего тона, переиздание 2004 года прочти, поможет :)
причем тут хороший тон? а вроде хамством не занимался
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730451
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
авторВот интересно, как крутяться задачи по расчетам зп, кварплаты, схемы энергопотребления промышленных абонентов, где расчет идет по графам на ХП ?

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

ЗЫ. как-то никак не вьезжаю в суьб спора, есть дата тиер, он на хп, что может помешать мидл тиеру обращатся к хп не врубаюсь.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730459
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tygra

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

ASCRUS
авторВот интересно, как крутяться задачи по расчетам зп, кварплаты, схемы энергопотребления промышленных абонентов, где расчет идет по графам на ХП ? И неплохо крутятся, так как SQL в свете динамического SQL еще и выступает для бизнес-логики в качестве встроенного языка, на котором можно не только быстро и красиво описать правила расчетов обьектов (уточню - запросами, а не курсорчиками), но еще и позволяет организовать хранение истории изменения самих алгоритмов во времени (хоть задними числами).

Расчет ЗП - это алгоритм - где именно и на чем он реализован - дело десятое. Да SQL рулит в качестве средства преобразования одних структурированных данных в другие - спору нет. Но насчет того же dynamic SQL - все знают чего он стоит в DBMS - и странно спорить о том что сделать это же на ОО-языке было бы еще проще. Хотя не в этом дело. Почему-то логика в СУБД и логика где-то еще постоянно противопоставляется друг другу - это не так! Логика должна быть сосредоточена там где ее возможно реализовать максимально эффективно. При этом логика - это не один алгоритм и не два - а намного больше. Что-то будет в БД, что-то нет. Вот здесь и неплохо будет иметь общий знаменатель в лице middle tier'а И еще я думаю, что тот же пример с зарплатой - это как говорят не благодаря, а вопреки...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730465
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yo!ЗЫ. как-то никак не вьезжаю в суьб спора, есть дата тиер, он на хп, что может помешать мидл тиеру обращатся к хп не врубаюсь.Обычно так и бывает, одно другому не мешает.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730560
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tygra
Да, по поводу независимости от СУБД клиента, который ходит к апп-серверу: это только рекламный лозунг, все-равно придется переделывать или менять апп-сервер.
Так какая разница тогда, если я с тем же успехом поменяю вызовы ХП у клиента? Никакой! Сам клиент - интерфейс - не меняется. Зато нет лишнего звена, которое сначала надо еще сделать, потом сделать клиента, который будет вызывать методы апп-сервера - это вместо того, чтобы вызывать ХП или запросы из БД.


Ну если Вы хоть что-то меняете на клиенте, пусть Вызовы ХП, то на все клиетские компы его надо инсталировать. А их к примеру 2000. А в рекламном лозунге намекается на то, что на клиенте вообще ничего не надо делать. Т.е. если меняется 3 звено, то это затронет 2 и 3. А 1 - нет. А если звеньев 4 и более? Ожидается какая ни на есть независимомсть между не связанными между сабой на прямую звеньями.

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


Т.е. при прочих равных условиях духзвенка имеет плюсы, особенно, если сюда включать и трехзвенку с WEB сервром. Хотя можно обратить внимание, что просто в настоящее время среднее звено WEB - сервер хорошо освоен, и тот кто почти ничего в нем не смыслит, делает сайты и все такое. И если тоже случится с серверами приложений, то этот плюс двузвенок будет иметь меньшее значение. Т.е., возможно, тогда и их захотят считать двухзвенками.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730565
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но насчет того же dynamic SQL - все знают чего он стоит в DBMS
Я знаю, чего он стоит в MSSQL, но я так же знаю, что он ничего не стоит в Sybase ASA. Или Вы считаете, что он во всех СУБД чего то стоит ?

Логика должна быть сосредоточена там где ее возможно реализовать максимально эффективно.
Золотые слова. Поэтому все вышенаписанные высказывания насчет реализации на третьем звене того, что уже есть в СУБД выглядят странно и необьяснимо.

При этом логика - это не один алгоритм и не два - а намного больше. Что-то будет в БД, что-то нет. Вот здесь и неплохо будет иметь общий знаменатель в лице middle tier'а
Интересно зачем мне общий знаменатель между хранением и обработкой данных и расчетами ? Общим знаменатель у них только один - информация в базе данных. Соотвествующе СУБД и есть тот самый общий знаменатель, а GUI, веб, расчеты, отчеты и что угодно - это равноправные пользовательские приложения по отношению к нему. И задачи у них разные, соотвествующе и общее у них только - это структура хранения информации. Информация может храниться сложно, но СУБД позволяет сделать единый уровень ее вьюверы и изменения через представления и ХП, а на триггерах реализовать проверки и действия на события. Этого вполне достаточно, чтобы любое приложение далее посредством SQL могло получать и изменять информацию в базе данных, вне зависимости от поставленных задач.

авторИ еще я думаю, что тот же пример с зарплатой - это как говорят не благодаря, а вопреки...
У меня полный расчет 1000 сотрудников вместе с налогами и ЕСН на Sybase ASA, запущенный из под обычного ISQL проходит ровно за 3 секунды, причем СУБД крутиться на 32 метрах памяти, не занимает процессорной мощности, продолжает обслуживать пользовательские приложения и одновременно строит HTML-формы строгой отчетности по макетам, возвращая их через веб-сервисы (выступая еще в роли выделенного HTTP сервера), которые спокойно можно открыть через любой браузер, Word или OpenOffice. Плюс обычный клиент, который реализован на PB и ничем кроме как отображения и сохранения информации в БД, а так же создания бандовых отчетов не занимается. Где тут место еще одному звену ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730622
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Интересно зачем мне общий знаменатель между хранением и обработкой данных и расчетами ?

Хотя бы для прозрачной интеграции с другими частями системы. Ведь те же web services что были упомянуты - это ведь уже не СУБД (встроенный в ASA HTTP сервер не в счет)

Общим знаменатель у них только один - информация в базе данных.

Согласен - только эта информация может быть очень разнородной и ее может быть просто много. Ясно что от разработчика необходима дисциплина - я говорю о том что в РСУБД для ее контроля меньше средств. Т.е. той же инкапсуляции что есть в ОО-архитектуре.

Информация может храниться сложно, но СУБД позволяет сделать единый уровень ее вьюверы и изменения через представления и ХП, а на триггерах реализовать проверки и действия на события. Этого вполне достаточно, чтобы любое приложение далее посредством SQL могло получать и изменять информацию в базе данных, вне зависимости от поставленных задач.

Дело в том что это хорошие средства - но уже давно есть и получше! Просто по сути (если упрощать) - спор похож на структурное проектирование vs ООП. Ясно что задачи можно решить и так и так - но у ООП есть некоторые плюсы сделавшие его лидером

У меня полный расчет 1000 сотрудников вместе с налогами и ЕСН на Sybase ASA, запущенный из под обычного ISQL проходит ровно за 3 секунды

заю знаю - и всем это всегда в пример привожу!
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730633
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZhiv
Триггера появились в СУБД ДО появления поддержки декларативной ссылочной целостности.
Неправда ваша, в DB2/390 констрейнты были с самого рождения 20 лет назад.
Первый кто кстати реализовал triggers и SP сдается мне был Informix году эдак в 89.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730654
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
авторИнтересно зачем мне общий знаменатель между хранением и обработкой данных и расчетами ?
[scip]
Где тут место еще одному звену ?

берем sybase - 2 субд, одна для отчетов (IQ), другая OLPT (ASA) есть корпоративная система. где у нее знаменатель общее ? в ASA или ASE ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730658
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
тьфу IQ или ASA
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730666
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точки зрения входящих данных общим знаменателем будет ASA, с точки зрения центрального аналитического хранилища данных - IQ. Соотвествующе клиентское приложение не будет писать информацию в IQ, а отчетник для построения аналитики не будет пытаться взять данные со всех удаленных ASA. Опять же - каждый выполняет свою работу и самый самый общий знаменатель тут не нужен.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730686
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
в смысле аналитику предлагаете принципиально запрещать работать с OLPT базой ? а если у меня для аналитика и оператора один клиент просто у аналитика что-то запрещено + дополнительная закладка с аналитическими отчетами ... или я принципиально должен делать для каждой роли свой клиент ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730707
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот и я, девочки ((с) чей-то)

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

Зачем же я буду читать книжки о технологии - точнее, о конкретном ее применении - которая мне не нужна и на которой я не работаю? Я же задал конкретные вопросы, мне бы на них ответы. А то я сам себе выгодные для себя ответы выдам :)

savage79Обычно так и бывает, одно другому не мешает.
Тогда в чем преимущества? Конкретные преимущества - будем считать, что я прочел книжки но преимуществ многозвенки в конкретно этом примере не нашел.

vadiminfoНу если Вы хоть что-то меняете на клиенте, пусть Вызовы ХП, то на все клиетские компы его надо инсталировать. А их к примеру 2000. А в рекламном лозунге намекается на то, что на клиенте вообще ничего не надо делать. Т.е. если меняется 3 звено, то это затронет 2 и 3. А 1 - нет. А если звеньев 4 и более? Ожидается какая ни на есть независимомсть между не связанными между сабой на прямую звеньями.

Ай-ай, совсем не так. Давайте по ситуациям:

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

2. Добавляется колонка в результат, колонку надо вывести на клиента в список. Все действия из п.1 + перекомпиляция клиента и его переинсталляция. И для ХП, и для апп-сервера клиент меняется.

3. А три нет - только два варианта.

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

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

Об чем и разговор!!!

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

Да, точно!

Но тогда что такое многозвенка?
Трехзвенка с вебсервером и например asp.net не является по сути трехзвенкой - это все та же двухзвенка.

А как вы отнесетесь к определению многозвенки вот таким способом: многозвенка является многозвенкой, если
-- все звенья пишутся программистом (может не с ноля, но настраиваются, меняются и т.п.)
-- в средних звеньях есть обработка данных, заложена бизнес-логика
-- СУБД без среднего звена не может предоставлять доступ другим приложениям для работы с данными.

Об таких многозвенках мы тут и говорим.
Другие многозвенки просто из другой степи.
--------------------

funikovyuriХотя бы для прозрачной интеграции с другими частями системы. Ведь те же web services что были упомянуты - это ведь уже не СУБД (встроенный в ASA HTTP сервер не в счет)

А вебсервисам не нужен никакой апп-сервер и их интегрировать ничем другим не надо - они имеют доступ к БД и спокойно с ней работают напрямую. Даже прямо сейчас вот, у нас :)

авторДело в том что это хорошие средства - но уже давно есть и получше! Просто по сути (если упрощать) - спор похож на структурное проектирование vs ООП. Ясно что задачи можно решить и так и так - но у ООП есть некоторые плюсы сделавшие его лидером

Про какие средства идет речь? Чем они лучше?

ЗЫ Вопросы без подвохов - спокойно разговариваем по теме.
Я честно - не для подколки, спора, не от того, что фанат двух-звенки - просто честно не понимаю смысла использования многозвенок, если только того не требует ситуация, которая такова, что двухзвенка просто совсем не справляется с поставленной задачей. Никакого злого умысла у меня нет


-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730720
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторв смысле аналитику предлагаете принципиально запрещать работать с OLPT базой ? а если у меня для аналитика и оператора один клиент просто у аналитика что-то запрещено + дополнительная закладка с аналитическими отчетами ... или я принципиально должен делать для каждой роли свой клиент ?

Ну запрещать то зачем.

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

У нас к примеру отдельный сервер с кубами, к нему сделан отдельный клиент - потому как совсем по-другому с кубами работать. Кому есть доступ - тот через этого клиента может посмотреть все, что нужно.
На рабочей же базе есть текущие отчеты, открываются из общего клиента. Только обычно они ограничены по периоду - неделей. Чтобы не нагружать рабочий сервер. И я не вижу смысла делать какой-то апп-сервер чтобы совмещать несовместимое. Ведь в принципе "большие" отчеты - это совсем отдельная от текущей работы вещь.

ЗЫ Эххх, пятница, душно, слова забываю, термины..... Срочно пора отдыхать.... О, так уже через 25 минут домой!

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730729
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
один клиент несколько конекций к разным субд ... некошерно в плане общего знаменателя
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730730
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo!в смысле аналитику предлагаете принципиально запрещать работать с OLPT базой ? а если у меня для аналитика и оператора один клиент просто у аналитика что-то запрещено + дополнительная закладка с аналитическими отчетами ... или я принципиально должен делать для каждой роли свой клиент ?
В смысле, что я ничего не предлагал, Вы задали абстрактный вопрос, я так же абстрактно ответил. Думаю это не повод делать практические выводы о том, что я запрещаю аналитику обращаться к OLTP или что ему нужен обязательно другое клиентское приложение. Есть архитектор проекта, есть выбранная им платформа и способы реализации проекта, с практической точки зрения ни кого не волнует, как и на чем реализован проект - на Оракле или Sybase ASA, на классической 2-х звенке, апп-сервере или на Clipper. Главное на сколько он эффективно работает, какие финансовые затраты были на его разработку и сопровождение и насколько это окупаемо. В итоге любой спор решается примитивным подсчетом в денежном эквиваленте - приносит прибыль, значит платформа и средства его реализации были выбрано правильно, приносит убытки - значит был неправильно выбран архитектор. По такому критерию очень легко сравнивать и оценивать абсолютно любые технологии в разрезах одинаковых задач.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730748
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Yo!

Ну это же лучше, чем клиент и апп-сервер с коннектом к разным СУБД :)
Можно разных клиентов, если хочется.

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

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

========
Ну, до понедельника. И главное, чтобы у всех системы работали, особенно в выходные

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730832
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
2ASCRUS

ну вот видите, скоро мы наконец сойдемся что нет черного или белого :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32730841
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tygra
1. Вызов ХП или метода апп-сервера есть, он сам не меняется, меняется внутренний код ХП или метода - в случае БД, ХП в БД перезаливается и все, в случае апп-сервера - либо так же, либо !!! если у вас есть обработка данных в апп-сервере перекомпиляется апп-сервер и переинсталлируется. А это останов работы, да и вообще больше действий, чем с ХП

2. Добавляется колонка в результат, колонку надо вывести на клиента в список. Все действия из п.1 + перекомпиляция клиента и его переинсталляция. И для ХП, и для апп-сервера клиент меняется.

3. А три нет - только два варианта.

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

Может я не совсем понял Ваши примеры. Речь о том, что, например, меняя СУБД Вы меняете ХП, и что угодно с любыми сложностями, но на сервере приложений и сервере БД. А клиента не трогаете. Это - независимость из рекламного лозунга. Вся его логика на сервере приложений. Интерфейс между клиентом и сервером приложений не меняется. Такое разве не возможно ни при каких обстоятельствах?

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

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

Ну, и так исходя только из кол-ва звеньев. Независимость модулей, между которыми нет интерфейса, разве не может иметь место где угодно, не только в многозвенках? Скажите мне.

tygra
А как вы отнесетесь к определению многозвенки вот таким способом: многозвенка является многозвенкой, если
-- все звенья пишутся программистом (может не с ноля, но настраиваются, меняются и т.п.)
-- в средних звеньях есть обработка данных, заложена бизнес-логика
-- СУБД без среднего звена не может предоставлять доступ другим приложениям для работы с данными.

Об таких многозвенках мы тут и говорим.
Другие многозвенки просто из другой степи.



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

Мы здесь обсуждаем двухзвенную и многозвенные архитектуры приложений БД . При этом, трехзвенную архтектуру с сервером приложений считаем традиционной трехзвенной архитектурой. И далее под трехзвенкой понимаем такие приложения БД . А приложения с использованием WEB среды как платформы приложений БД не рассматриваем, если в ней не просматривается явный сервер приложений, считая ее нетрадиционной трехзвенкой - многозвенка из другой степи.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32731006
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Просто по сути (если упрощать) - спор похож на структурное проектирование vs ООП. Ясно что задачи можно решить и так и так - но у ООП есть некоторые плюсы сделавшие его лидером

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

2 vadiminfo

> Ну если Вы хоть что-то меняете на клиенте, пусть Вызовы ХП, то на все клиетские компы его надо инсталировать. А их к примеру 2000.

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

> Мы здесь обсуждаем двухзвенную и многозвенные архитектуры приложений БД . При этом, трехзвенную архтектуру с сервером приложений считаем традиционной трехзвенной архитектурой. И далее под трехзвенкой понимаем такие приложения БД . А приложения с использованием WEB среды как платформы приложений БД не рассматриваем, если в ней не просматривается явный сервер приложений, считая ее нетрадиционной трехзвенкой - многозвенка из другой степи.

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

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

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

Единственное очевидное преимущество - это возможность поставить несколько серверов приложений, равномерно рассовать пользователей по ним и обрабатывать данные параллельно. Но тут сразу возникает немаленькая проблема с синхронизацией кешированных данных. А не кешировать нельзя. Это особенно проблема если пользователи не имеют постоянной сессии (например ходят из интернета) и неизвестно на какой из серверов приложений пользователь попадет в следующий раз. А перечитывать все каждый раз из БД тоже нельзя по вышеупомянутым причинам.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32731010
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может сказать проще - многозвенка выгодна лишь в двух случаях:
1)при распределенных транзакциях
2)когда подключений очень много, а логика достаточно проста чтобы вынести ее в среднее звено которое работает с БД через небольшой пул своих соединений.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32731030
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
авторТеперь скорости обработки данных. SQL сервера отлаживаются и оптимизируются как раз в плане производительности не один десяток лет. Что-то не верится, что в сервере приложений можно обеспечить большую скорость обработки, ведь в обоих случаях логически одинаковые действия должны быть выполнены над теми же данными, только лежащими не в таблицах, а в массивах или где-то там еще.

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

авторЭто особенно проблема если пользователи не имеют постоянной сессии (например ходят из интернета) и неизвестно на какой из серверов приложений пользователь попадет в следующий раз. А перечитывать все каждый раз из БД тоже нельзя по вышеупомянутым причинам.

вообще-то балансер обычно по хеш функции раскидывает юзеров, т.е. один и тот же всегда на один и тот-же хост попадает. но в принципе никто не мешает их сесии (кеши) хранить на общей файловой системе, тогда вообще по барабану на который хост тебя перекинули.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32731033
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127
Так ведь клиент по большому счету не знает, ходит ли он на сервер приложений или в базу.


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

Клиент - Интерфейс пользователя
Сервер приложений: Основная логика приложения, Логика обработки данных
Сервер БД: Контроль данных, Доступ к БД.

В двухзвенной:

Клиент - Интерфейс пользователя, Основная логика обработки данных
Сервер БД: Контроль данных на серверной стороне, Доступ к БД.

Поэтому как бы походы клиента в БД выглядят излишними.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32731206
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Можно как угодно хорошо спроектировать и написать иерархию классов, но все равно копаться в коде ООП не самое интересное занятие. Я думаю все это происходит из за того, что 3-и звенья пытаются обвязать РСУБД обьектным описанием сущностей, что взаимоисключающие понятия. Тут в данном случае даже Cache лучше выглядит, так как ООП просто ложится в его парадигму хранения и обработки данных. У меня лично всегда, когда я вижу связку, где РСУБД хранилище данных, а основные описания структуры и логики реализованны на ООП возникает видение ежа с удавом.


Все-таки это удар не по трехзвенкам, а по РСУБД. Сервер приложений можно реализовать без ООП. А вот если РСУБД и объектное описание сущностей были бы взаимоисключающими понятиями, то это не сулило бы нечего хорошего РСУБД в перспективе, поскольку ООП - это несомненно успешная парадигма программирования. Более того, нам с Вами как базистам желательно, чтобы роль данных возрастала по сравнению с процедурами. А в ООП это имеет место. И, кроме того, если хорошо спроектировать и написать иерархию классов, то скорее всего получится приложение, в котором относительно легко будет наращивать относительно сложный функционал.
Вы сами отдаете преимущество Cache. Однако, в двухзвенках используются ООП на клиентской стороне и даже в файл серверной (Access). Более того, есть надежды и на ОРСУБД как перспективы для РСУБД. Т.е. Вы больше предсказали, что будущее за ООСУБД , чем пошатнули позиции многозвенок.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32731771
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanВ принципе ASCRUS ответил правильно. Ошибка в триггере еще не значит, что всю транзакцию нужно откатывать. Все зависит от логики приложения.

Да, правильно. А целостность базы данных - это еще не значит, что ее надо поддерживать - все зависит от логики приложения !!!


Вы так договоритесь до такого ...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32731778
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tygraБыл недавно не менее "прохладный" топик по поводу использования select-ов прямо из клиента (апп-сервера в этом случае) вместо ХП в БД. Очень уж это странно.

О, Тигра, да ты ж за меня !! А ну давай их всех вместе грррызть !!!
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32731831
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoВ двухзвенной:

Клиент - Интерфейс пользователя, Основная логика обработки данных
Сервер БД: Контроль данных на серверной стороне, Доступ к БД.

Поэтому как бы походы клиента в БД выглядят излишними.

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

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

Вот смотрите, как на самом деле должно быть и есть обычно:

Клиент - Интерфейс пользователя
Сервер БД: Основная логика обработки данных , Контроль данных на серверной стороне, Доступ к БД.

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

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

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

ЗЫ Может кто еще все еще думает, что логика лежит на клиенте? Хотя уже три страницы говорится о том, что вся логика в БД!!!

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732000
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Повторюсь, не всегда можно все обработать только средствами БД. Иногда бывают случаи когда нужна:

1. обработка по расписанию (с помощью ХП можно выполнить задачи по расписанию?)

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

3. обработка источников данных отличных от БД. (работа с эл.почтой и другими информационными системами)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732035
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1. обработка по расписанию (с помощью ХП можно выполнить задачи по расписанию?)
Да, конечно, это можно сделать с помощью job-ов - настроить выпонение ХП на конкретное время, периодичность и т.д. Оно обычно всегда применяется - хотя бы для бэкапов.

автор2. обработка входных файлов, напимер для систем эл. документооборота, когда клиент может выгрузить на сервер неструктурированный документ, напимер формата word, этот документ должен быть разобран с помощью какой-либо бизнес-логики, выделена нужная информация, напимер из полей excel файла или полей doc файла (договор формата word с полями в который обозначена сумма договора и пр.) (это можно сделать с помощью ХП?)
Ну это тоже можно, правда тут кто как любит. Можно и клиентом разобрать, а можно файл на сервер закинуть а потом расширенной хранимой процедурой - которая лежит в DLL и делает что нужно. Можно отдельную утилиту написать - и пусть она по шедулеру крутится.

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

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732086
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tygra
Эээээ, батенька, да вы неправильно себе представляете клиент-серверное приложение!!! Вот оно что, вот почему вы за многозвенки то ратуете!!!


Не я, однако, это - традиционная двухзвенка (не поленился толстую книгу открыть и переписать). Обратите внимание на термин "традиционная".
То, что ХП выполняют часть логики - это просто означает, что это не совсем традиционное распределение функций между уровнями двухзвенной архитектуры. А традиционно представления, что нечего в БД делать логике клиента(тов). Там информация, а на клиенте логика ее обработки согласно внешней модели данных для того юзера, для которого этот клиент. Боюсь, что Вы скорей обосновываете пользу многозвенки, чем ее опровергаете. На клиенте логики быть не должно, а в БД она как бы не совсем на своем месте. Но в любом случае в двухзвенке некоторая часть логики в серьезных приложениях оказывается на клиенте (Вызовы ХП и какая-то обработка данных, которые они вернули).

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

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



tygra
А ваша схема отвечает файл-серверным системам.


К, сожалению, не моя. В файл сервеной на стороне сервера только файлы, а на каждом клиетском компе СУБД. А на файл-сервере только контроль доступа к файлам. Т.е. на клиенте еще и "Контроль данных на серверной стороне, Доступ к БД".

tygra
Вот теперь посмотрите и все встанет на свои места. А места такие: средний слой выкидывается, остается клиент, который все так же только отображает информацию, и БД, которая заключает всю логику. Средний слой просто не нужен - незачем ему тут быть.




Хорошо, среднее звено заберет логику из БД.
Речь не о том, что нельзя обойтись без среднего слоя. А о преимуществах, которые он может дать в общем случае.
Кто-то, может, скажет, что можно обойтись и файл-серверной архитектурой - клиен серверная не нужна. Все можно и в файл-серверной. Мы же до этого про преимущества говорили.

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


Но архитектура разная. В ней то и дело в плане и поддержки в том числе.
То что недостатки есть я согласен. Трудо согласиться, что нет достоинств.
Можно найти достоинства и в файл-серверной. Все в СУБД и данные и логика и интерфейсы в БД (Аксесс). Вообще самая легкая разработка.



tygra
ЗЫ Может кто еще все еще думает, что логика лежит на клиенте? Хотя уже три страницы говорится о том, что вся логика в БД!!!


Страницы страницам рознь. Есть еще и какие-то традиционные вещи, придуманные теми, кто создавал все эти технологии. Впрочем, даже этот частный случай вроде пока не отменяет тех преимуществ, что я писал.
Хотя, я тоже писал, что из соображений перераспределения ресурсов ХП реализуют часть логики клиентов. Но на сколько это здорово пока не знаю. Однако, чаще клиенту возвращаются курсоры и результаты запросов, которые представляют клиенту абстрактные по отношению к внешней модели данные. А клиент обработывает их уже в соответствии с логикой для пользователя этого клиента. Решает линейные уравнения или просто рисует шахматки и т.д.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732090
Denis A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чота все перешли во флейм и забыли, что не бывает абсолютных вещей. Любое решение прежде всего делается для РЕШЕНИЯ задачи. Трехзвенка - это не панацея от любых проблем, также как и двухзвенка. Если бы эти технологии не были нужны они бы просто не появились. Случаи - они разные бывают. Искусство программиста - найти золотую середину.

Спор считаю бредом, так же как и любое другое мнение, хыхы ;)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732117
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну зачем же выписывать из каких-то книг странные определения.

Мы говорим не об определениях, а о реальных системах.
А реальные нормальные клиент-серверные системы держат всю логику в БД.

И есть вопрос как раз - какие преимущества дает средний слой кроме лишней работы? Приду с обеда - напишу полнее....

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732185
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tygra
Ну зачем же выписывать из каких-то книг странные определения



Их странность не так уж и очевидна.

tygra

А реальные нормальные клиент-серверные системы держат всю логику в БД.



Это можно истолковать и как обоснование трехзвенки для реальных нормальных систем. Логика на ХП - это серверная часть приложения. Даже то, что она в БД уже можно рассматривать как сервер приложения в БД. Т.е. средний слой в БД. В Оракле 8 EJB реализуется так, что контейнер в БД. Т.е. логически трехзвенка, физически двухзвенка. Почему бы теперь его не вынести из БД в некоторых случаях? Оракл 9 и вынес ее.

tygra
И есть вопрос как раз - какие преимущества дает средний слой кроме лишней работы?


Одно из, которых мы и пытаемся оценить. То что Вы всю логику запихали в БД, отменяло преимущество тонкого клиента в трехзвенке. Означает, что в некоторых случаях (примитивная логика клиента) это преимущесто трехзвенки не проявляется.
А вот на большую независимость клиента от СУБД и наоборот это вроде мало влияет.
Вызовы ХП на сервере приложений. Меняете СУБД, исправляете на сервере приложений что-то, но клиенты ничего не знают об этом - их менять не надо. Поясните это.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732240
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот я и пообедал (привозным корпоративным обедом, бее...)

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

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

авторА традиционно представления, что нечего в БД делать логике клиента(тов).
О какой такой логике клиентов идет речь? Есть логика системы - при чем тут клиент. И давайте будем отталкиваться от того, что современная к-с система подразумевает хранение максимального объема логики в БД.

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

авторБоюсь, что Вы скорей обосновываете пользу многозвенки, чем ее опровергаете.
Так вот как раз наоборот :)

авторНа клиенте логики быть не должно
Точно! У меня и еще десятка-другого человек из этого форума ее там и нет.

автора в БД она как бы не совсем на своем месте.
А вот тут то вы и ошибаетесь! Как раз там ей и место. Как раз там она у нас всех и находится.
Тут понимаете ли получается вот что: те, кто разрабатывают к-с системы, опираются не на древние определения, а реально разрабатывают, и так, чтобы было как можно лучше, проще и удобнее. И получается, что именно сейчас вот это лучше, проще и удобнее - когда логика вся лежит в БД.
То, что вы никогда не разрабатывали к-с систем, или имеете негативный опыт разработки, или пользовались при разработке определением из книг, совсем не значит, что все системы именно такие убогие.

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

В третьих....
Ну поверьте, поверьте мне и нам, нет никакой логики на клиенте в наших системах, ну нет ее там, нет!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Вся логика в БД, вся, вся, которая только может там быть!!!!!!!!!!!!!!!

Давайте вы теперь именно с такой стороны будете сравнивать к-с систему и многозвенку, ну пожалуйста, не надо определений никаких из книг!!! :)

===========

авторВпрочем, даже Ваш вариант не отменяет отменяет независимость (хорошо - большую независимость в общем случае) клиетна от СУБД в случае трехвенки. Вызовы ХП теперь ведь на сервере приложений. Заменяете СУБД, переделываете сервер приложений. А клиент об этом ничего не знает.
Это рекламные лозунги и только. Где вы видели системы, в которых клиент работает и на ходу ему вдруг подпихивают другой сервер? Всегда переход на другую СУБД занимает какое-то время и в любом случае нет разницы - раскопировать клиентов или апп-сервер. А переделка клиента - небольшая - не труднее, а может даже проще, чем переделка апп-сервера. Да и слишком дорого это - делать лишний слой только из-за того, что может быть когда-нибудь вдруг почему-то будет переход на другую СУБД. Слишком большие накладные расходы.

авторКроме того, я ратую не за многозвенки, а за возможность выбора различных архитектур для конкретного проекта на основе анализа достоинств и недостатков в конкретном случае. Т.е. я за то, чтобы были и двухзвенки и многозвенки. Вы говорите, что у моногозвенок нет никаких достоинств. Это, я действительно, не могу пока понять.
Я тоже так думаю. Только лишь с одной поправкой: моногозвенок нет никаких достоинств в стандартных системах, решаемых к-с технологией . Стандартных - это любых системах, где есть СУБД и клиенты.

К, сожалению, не моя. В файл сервеной на стороне сервера только файлы, а на каждом клиетском компе СУБД. А на файл-сервере только контроль доступа к файлам. Т.е. на клиенте еще и "Контроль данных на серверной стороне, Доступ к БД".



-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732259
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последний абзац считать недействительным - случайно нажал кнопку "Опубликовать" :))

===

авторНо архитектура разная. В ней то и дело в плане и поддержки в том числе.
То что недостатки есть я согласен. Трудо согласиться, что нет достоинств.
Можно найти достоинства и в файл-серверной. Все в СУБД и данные и логика и интерфейсы в БД (Аксесс). Вообще самая легкая разработка.
Я и пытаюсь найти достоинства, но никак не нахожу. Лично для себя.

авторЭто можно истолковать и как обоснование трехзвенки для реальных нормальных систем. Логика на ХП - это серверная часть приложения. Даже то, что она в БД уже можно рассматривать как сервер приложения в БД. Т.е. средний слой в БД. В Оракле 8 EJB реализуется так, что контейнер в БД. Т.е. логически трехзвенка, физически двухзвенка. Почему бы теперь его не вынести из БД в некоторых случаях? Оракл 9 и вынес ее.

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

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

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732266
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да чтож ты будешь делать, опять не в ту кнопку :)

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

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

==============
Ох, наверное завершу я тут, а то устал. Да и работать надо :)

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732267
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. получается, что Вы не против трехзвенок, а под двухзвенкой понимаете логическую трехзвенку, и не интерпрайзный сервер приложений типа ХП. Но против физических трехзвенок и их энтерпрайзных технолгоий EJB, CORBA, WEB - сервисы и неинтерпрайзных. У нас просто опять путаница в терминологии. А Вы говорите зачем переписывать определения? Чтобы лучше понять о чем мы говорим.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732270
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но все же резюмирую:

Единственное "достоинство" многозвенки - это незаметная для клиента подмена апп-сервера для работы с другой СУБД.

В 90% случаев это достоинство не имеет значения.

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732301
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТ.е. получается, что Вы не против трехзвенок, а под двухзвенкой понимаете логическую трехзвенку, и не интерпрайзный сервер приложений типа ХП. Но против физических трехзвенок и их энтерпрайзных технолгоий EJB, CORBA, WEB - сервисы и неинтерпрайзных. У нас просто опять путаница в терминологии. А Вы говорите зачем переписывать определения? Чтобы лучше понять о чем мы говорим.

Немного не так.

Под клиент-серверной системой я понимаю систему, в которой вся (или 99%) логики находится в БД, в следствие чего данные и логика неотделимы друг от друга, представляют независимый модуль, доступ к которому возможен практически из любого приложения, которое может работать с СУБД, с полной гарантией того, что данные и схема работы системы никак не пострадают (что не гарантируется многозвенкой).

Так пойдет?

Может кто еще получше даст определение - я не очень то в таких вещах. :)

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732306
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tygra
Ну это тоже можно, правда тут кто как любит. Можно и клиентом разобрать, а можно файл на сервер закинуть а потом расширенной хранимой процедурой - которая лежит в DLL и делает что нужно.
Фактически получается, что сервер БД выполняет функции сервера приложений, или другими словами, сервер приложений встроен в СУБД, как верно подметил vadiminfo.
Да и многие ли СУБД могут выполнять то, что написал tygra? Какой процент из всех существующих СУБД? Сервер приложений, в данном случае более универсальное средство.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732318
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
>Может кто еще получше даст определение - я не очень то в таких вещах. :)

эт видно, хоть бы книжку прочел прежде чем столько глупости писать ...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732409
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм, как то путанно все вышло :) Давайте определимся, кто что и под чем понимает:
1. Все пришли к выводу, что на клиенте бизнес-логику хранить не хорошо (и слава богу). Клиентское приложение должно красиво рисовать рюшечки, гриды, отчеты и вообще вести простой и безоблачный образ жизни :)
2. Все сошлись во мнении, что бизнес-логика должна писаться на средстве, которое заточено под это и имеет ряд особенностей, таких как безопасность и права доступа, управление транзакциями, возможность промежуточного кэширования данных и т.д.
3. Все согласны с тем, что слой бизнес-логики должен контролировать действия клиентов, отслеживая ненарушения истинности данных с точки зрения логической модели БД и позволять быстрый и прозрачный доступ к чтению и изменению данных клиентами.

Уф, теперь смотрим:
Способ создания слоя бизнес-логики № 1
- использование встроенного языка хранимых процедур СУБД позволяет в полном обьеме, достаточно легко и полнофункционально реализовать все, что перечесленно в этих 3-х пунктах. В качестве недостатков можно отнести алгоритмичность языка, что однако перекрывается огромным достоинством - интрепретируемостью языка хранимых процедур и динамическим SQL. Я, например генерю триггеры и процедуры по шаблонам с поддержкой макросов (на лично разработанном под это средстве, но любое Case умеет то же), что позволяет описывать повторно используемые скрипты - от запросов до целых секций кода, где каждая таблица в БД имеет свое расширенное мета-описание в метаструктуре на достаточно высоком логическом уровне - например, у таблицы выставлено, что она является хранилищем аттрибутов обьектов некой родительской таблицы, изменяющихся во времени. Будут сгенерированы все нужные ХП и триггера - контроль, возвращение значений обьектов и их текущих аттрибутов, ХП добавления, изменения и удаления записей с нужной раскидкой по обоим таблицам. Клиентскому приложению остается только воспользоваться сгенерироваными ХП и даже не знать о том, что обьект на самом деле поделен на 2 таблицы. К слову у меня в проекте большая часть логики (под 200 хранимых процедур и 150 триггеров) сгенерировано автоматически и одним взмахом руки (по F5) я могу централизованно изменить или дополнить в них логику, просто отредактировав макет :)

Способ создания слоя бизнес-логики № 2
- использование апп-сервера и высокоуровнего ООП языка. Фактически то же самое, что и способ № 1, только вся реализация вместо интрепретируемого языка, макетов и т.д. ведется посредством компонент, ООП и других прелестей высокоуровневых языков и возможностей апп-серверов.

Итак что видим - интерфейс (назначение) у обоих способов одинаковое, имплементашион (реализация) естественно разная.

Тут вспоминаем IBM DB2 и глубокомысленно задаем себе вопрос - БД на этой СУБД, где нет языка хранимых процедур и все пишется через внешние Си или Java процедуры - это к чему относить ?

Из этого вопроса возникает следствие - все мы программируем как минимум на 3-х звеньях, отделяя данные, бизнес-логику и клиента. Только одним нравиться это делать по SQL-ному, так как если посмотреть триггера и ХП, то окажется, что там от алгоритмического языка маловато будет - все запросы, да запросы. А другим нравиться все на классах, контейнерах и компонентах делать. Из сего вывод - сравнивать 2-х и 3-х звенку в данном контексте бестолку, давайте уж сравнивать подходы - алгоритмически-запросные и ООП-компонентные.

P.S. Уф, надеюсь выразился понятно и внятно :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732432
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savage79 tygra
Ну это тоже можно, правда тут кто как любит. Можно и клиентом разобрать, а можно файл на сервер закинуть а потом расширенной хранимой процедурой - которая лежит в DLL и делает что нужно.
Фактически получается, что сервер БД выполняет функции сервера приложений, или другими словами, сервер приложений встроен в СУБД, как верно подметил vadiminfo.
Да и многие ли СУБД могут выполнять то, что написал tygra? Какой процент из всех существующих СУБД? Сервер приложений, в данном случае более универсальное средство.
В догонку - как минимум, у двух из известных мне СУБД, языки хранимых процедур PL/SQL Оракла и WatcomSQL Sybase ASA позволяют писать достаточно мощный по функционалу код (вплоть до обработки исключений, области видимости переменных, поддержки и работы в скриптах с обьектами Java, хранению Java обьектов в полях таблиц и полноценной работе с их методами и полями прямо из SQL и т.д.). TSQL от MSSQL пока в этом плане отстает, но с выходом 2005 версии сократит разрывы и ограничения, особенно если учесть интеграцию в него поддержки C#.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732438
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUS
P.S. Уф, надеюсь выразился понятно и внятно :)
Cказано все верно и я полностью с этим согласен. Тока к сожалению не все разработчики понимают, что бизнес логику на клиенте хранить не надо. Пример тому это всем хорошо известная пресловутая 1С. )
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732459
---------------
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
savage79Тока к сожалению не все разработчики понимают, что бизнес логику на клиенте хранить не надо. Пример тому это всем хорошо известная пресловутая 1С.Да все они понимают. Только вы себе представляете инерцию продукта с такими тиражами как у них ? Да еще учитывая необходимость поддержки разных версий.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732497
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo!эт видно, хоть бы книжку прочел прежде чем столько глупости писать ...
Тут уже были определения из книжек... Устарели они Да и я по поводу давания определений, а не по предмету, туг на язык :)

2 ASCRUS
Тоже полностью согласен

2 savage79
Не только 1С. Есть и на нашем форуме люди, которые хранят логику на клиенте. Не будем на них показывать пальцем. :)

В общем, победила дружба :)

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732501
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Тут вспоминаем IBM DB2 и глубокомысленно задаем себе вопрос - БД на этой СУБД, где нет языка хранимых процедур и все пишется через внешние Си или Java процедуры - это к чему относить ?


Уважаемый ASCRUS наверно не в курсе - но все это есть в DB2.
Была лишь разница в способе реализации по сравнению с другими базами данных.ХП были с версии 5. Сохраненку можно было писать на SQL/PL и на серваке она преобразовывалась в C - код. Нужен был С++/ Java компилер на стороне сервера. А начиная с версии 8.2 (Stinger) - появилась поноценная реализация внутренней машины SQL/PL языка. И теперь необходимость в компиляторе на стороне сервера отпала.

Но, говоря по честному, то, как был реализован COMPOUND SQL в DB2 - это было очень похоже на урезанный встроенный компилер SQL/PL. Вобщем IBM

Замечу всеже, что сохраненки на С/C++ работают все равно быстрее чем с помощью внутренней машины SQL/PL. И они особенно полезны при громоздких вычислениях на стороне сервера.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732525
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman
Уважаемый ASCRUS наверно не в курсе - но все это есть в DB2.
Была лишь разница в способе реализации по сравнению с другими базами данных.ХП были с версии 5. Сохраненку можно было писать на SQL/PL и на серваке она преобразовывалась в C - код. Нужен был С++/ Java компилер на стороне сервера. А начиная с версии 8.2 (Stinger) - появилась поноценная реализация внутренней машины SQL/PL языка. И теперь необходимость в компиляторе на стороне сервера отпала.

Но, говоря по честному, то, как был реализован COMPOUND SQL в DB2 - это было очень похоже на урезанный встроенный компилер SQL/PL. Вобщем IBM

Замечу всеже, что сохраненки на С/C++ работают все равно быстрее чем с помощью внутренней машины SQL/PL. И они особенно полезны при громоздких вычислениях на стороне сервера.
Ну еще лучше. Думаю постоянное эволюционное развитие языка хранимых процедур во всех СУБД доказывает, что это тоже перспективное направление и никто сломя голову не бросится отказываться от него :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732526
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732601
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
размещение логики на апп-сервере по всем статьям выгодней и имет всего один небольшой минус ...

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

фишка апп сервера что есть уже готовые фреймворки там есть все. все уже изобретено, практически на все случаи жизни. нужно просто посмотреть как это делается http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpatterns/html/MSpatterns.asp

есть все один небольшой минус :) он работает не эфективно и делает кучу бесполезных действий ...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732634
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Под клиент-серверной системой я понимаю систему, в которой вся (или 99%) логики находится в БД, в следствие чего данные и логика неотделимы друг от друга, представляют независимый модуль, доступ к которому возможен практически из любого приложения, которое может работать с СУБД, с полной гарантией того, что данные и схема работы системы никак не пострадают (что не гарантируется многозвенкой).

Так пойдет?





Нет так, наверное, не совсем получится глапдко. Клиен серверная система означает всего лишь, что в системе есть клиенты и сервера. Другое дело что понимать по двухзвенной и трехзвенной архитектурой. Там на первом месте распредеклений функций. Где находится логика приложения клиента. На сервере - признак трехзвенной архитектуры. ПО сути то, что Вы называете двухзвенкой можно назвать как нетрадиционной двузвенкой, так и нетрадиционной трехзвенкой. Там есть признаки и того и другого из традициооных. Однако, с точки зрения распределения функций это ближе к трехзвенкам.

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

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


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

И определения из книжек не устарели. Недавно изданные.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732656
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторразмещение логики на апп-сервере по всем статьям выгодней и имет всего один небольшой минус ...
Да вот никак не можем мы статей этих получить, ну не можем ...!!!!!!!!!!!!!!!!!!!! Никто не говорит. Говорят, что есть такие статьи, кто-то даже их видел, но показать никто не смог :)

Дальнейшее непонятно, в чью сторону, но сделаем в сторону СУБД :)

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

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

автормощнее язык - java vs t-sql (не забывем что sql никто не отменял, речь о процедурных расширениях) спецы дешевле, кода меньше, выбор больше. на все задачи уже есть патерны и фреймворки.
Смотря про какую мощность говорить, пока и SQL хватает. Для дифференциальных уравнений есть расширенные процедуры - цепляйте DLL и вперед.
А вот по поводу спецов... Это вы зря, спецов СУБД гораздо больше, чем многозвенных....
авторхотя конечно можно java вызывать из t-sql но смысла от этого маловато.
Ну почему java? На что она вам далась то? Я лично на java не пишу - и ничего.

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

авторесть все один небольшой минус :) он работает не эфективно и делает кучу бесполезных действий ...
Эт точно!

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732689
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yo!есть все один небольшой минус :) он работает не эфективно и делает кучу бесполезных действий ...
Есть такое дело, за все удобства нужно платать.
В основном при этом не эффективно работает persistence manager, который отвечает за отображение объектов ОО-языка на таблицы БД. Но такие менеджеры всячески улучшают и оптимизируют.
Хотя говорить что это работает неффективно не совсем правильно, так же как говорить что работает не эффективно и делает кучу лишних действий высокоуровневый язык программирования, ведь ассемблер эффективней )
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732691
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vadiminfo

Я против выноса логики в апп-сервер!!!

Не должно ее там быть. И почему-то вы все говорите про какую-то логику клиента . Да нет никакой логики клиента - есть логика системы. Если лично вы хотите положить ее в клиента - ваше право, только это не есть гут. Я же предпочитаю внести всю логику в БД.

И еще раз - при включении логики в БД система становится намного универсальнее и удобнее: сейчас много откуда можно работать с СУБД, в отличие от работы с апп-сервером, которого просто так не увидишь (из Excel например). И работать с БД можно свободно, одновременно не нарушая логику системы - ничего не измените, миновав правила, просто потому что есть триггеры, ХП, которые не дадут этого сделать. В случае с апп-сервером такого не получится - изначально предполагается, что доступ и работа с данными только через апп-сервер. А смысл?

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732695
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И нет тут никакого третьего СУБДшного звена :) Есть работа с данными. Которая происходит по неким правилам. Все.

А вот надстройка над СУБД - это уже апп-сервер, среднее звено.

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732709
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
2tygra

полочи :) может за умного сойдешь ...
и почитай на досуге куда уже сейчас двигается MS и его MS office.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732719
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tygraсейчас много откуда можно работать с СУБД, в отличие от работы с апп-сервером, которого просто так не увидишь (из Excel например).
кто тебе такую глупость сказал????
подключайся к апп-серверу откуда хочешь и как хочешь, хоть из excel и word.обычно у апп-сервера есть куча интерфейсов для такие подключений, начиная от RPC и RMI, заканчивая SOAP. Многие системы эл.документооборота используют офисные системы для формирования и последующей сдачи таких документов из word-а, например, в систему документооборота для хранения. Для такой работы у ms office есть VBA, с помощью которого можно подключать любые COM объекты (такие как MSSOAP )и выполнять любые над ними действия.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732722
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К веб-сервисам они двигаются
Сами делали для них, знаем :)

Или еще куда? Ну так скажи. Чего все время загадками говорить?
А знаешь куда Оракл двигается? Аааа, а я не скажу :) Я типа умный :)

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732732
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tygraЯ против выноса логики в апп-сервер!!!
Это твое личное мнение, и если производители апп-серверов (SUN, Oracle, BEA, Borland) тебя послушают при этом, напиши об этом нам обязательно )
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732738
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 savage79

Хорошо, квиты :)

Но я все-равно не могу понять: для чего мне писать еще один (два,три,..?) звена в системе, где я обойдусь двумя?
Там, где я не обойдусь - это понятно, таких применений мало, но они есть. А вот там, где обойдусь - где смысл в апп-сервере? Если я сделаю систему, потратив N времени и сил, зачем мне еще тратить N+N/3 времени и сил на то же самое?

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732749
savage79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tygra
Но я все-равно не могу понять: для чего мне писать еще один (два,три,..?) звена в системе, где я обойдусь двумя?
Там, где я не обойдусь - это понятно, таких применений мало, но они есть. А вот там, где обойдусь - где смысл в апп-сервере? Если я сделаю систему, потратив N времени и сил, зачем мне еще тратить N+N/3 времени и сил на то же самое?

Писать бизнес логику на сервере приложений ничуть не сложенее чем на ХП. Сил при этом ты потратишь равно столько же, ни на йоту больше, а может даже меньше, т.к. как уже было сказано выше есть куча готовых решений для этого, типа всяких там шаблонов и пр... Ну а для чего нужен апп-сервер мы уже писали выше.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732756
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 savage79
про вынос логики

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

А продуктов разных много, смысла на них опираться нет. Потому как есть еще понятие моды - даже тут, в ИТ. Ну модно использовать апп-сервера. Ну что поделать. Вот было - и может есть - модно писать сайты на java. Только то, что это полная ж... никто же не говорил. Просто - java рулез и все. А то, что на asp.net делается все это в десять раз проще и быстрее.... Хотя .net теперь тоже модная вещь. :)

А вот есть C-Builder, Delphi, J-Builder... еще всякого. Это же не значит, что например на C-Builder нужно обязательно писать, потому что его выпускают.

Так что тут.......

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732832
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Я против выноса логики в апп-сервер!!!

Я же предпочитаю внести всю логику в БД.



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


автор
И еще раз - при включении логики в БД система становится намного универсальнее и удобнее: сейчас много откуда можно работать с СУБД, в отличие от работы с апп-сервером, которого просто так не увидишь (из Excel например). И работать с БД можно свободно, одновременно не нарушая логику системы - ничего не измените, миновав правила, просто потому что есть триггеры, ХП, которые не дадут этого сделать. В случае с апп-сервером такого не получится - изначально предполагается, что доступ и работа с данными только через апп-сервер. А смысл?

Ну, разумеется есть преимущества хранении логики в БД, если эта логика там себя хорошо чувствует. Есть даже преимущества от храннения там и интерфейсов с пользователем.
Многие преимущества, что я приводил тогда, конечно, можно не рассматривать, так как они обусловлены тем, что логика на сервере, не важно каком: сервере приложения или сервере БД.
Тогда кол-во преимуществ уменьшается. Но все же.
Разделение задачи на части по функционалу может упростить ее решение.
Функционал приложений (а их может быть много разных к одной БД) может быть достаточно сложным и, в общем случае, может быть плюс даже от того, что сами сервера на разных аппаратных плптформах или по разному настроенных серверах. Так специфика обработки данных и вычислений может требовать различных ресурсов или различного управления ими ОС.
Разделение труда. Управление БД и разработка логики приложения в общем случае требуют разных знаний.
Существуют технологии типа EJB, WEB - сервисы существенно упрощающие разработку и поддержку корпаративных систем. Они не всегда уместны в БД.
Это первое что напрашивается само собой.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32732858
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS

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

Рисование формочек на самом деле тоже будет зависеть от бизнес логики. Так что это только в относительно простом проекте моно рисовать gui без оглядки на все остальное!

На самом деле это просто вопрос организации. Вот интересно ASCRUS, что у тебя представляет собой клиент. Ну т.е. есть же какие-то правила, какая-то организация кода и на клиенте? Какая?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32733086
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri ASCRUS

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

Рисование формочек на самом деле тоже будет зависеть от бизнес логики. Так что это только в относительно простом проекте моно рисовать gui без оглядки на все остальное!

На самом деле это просто вопрос организации. Вот интересно ASCRUS, что у тебя представляет собой клиент. Ну т.е. есть же какие-то правила, какая-то организация кода и на клиенте? Какая?
Гм, ну у меня же клиент на PowerBuilder :) Там все просто и надежно - управление интерфейсом реализовано на основе ООП через повторно наследуемые компоненты и формы. Отображение данных сделано на представлениях DataWindow, задача которых получить данные с БД через ХП, отобразить их и записать изменения обратно через ХП. Так как DataWindow это не код, а именно представление, в котором есть собственный язык выражений DataWindow Expression (по аналогу как у Crystal Report), то все отображение с бизнес-логикой и отрисовывается прямо в DataWindow (что то типа "Column2.Visible = IF(Column1 = 1, 1, 0)" и т.д.). Проверки и ограничения на значения полей в том же DataWindow и описываются. Естественно все в DataWindow описывать на языке выражений нельзя, поэтому на пересечении унаследованных от базовых форм и компонент и лежащих на них DataWindow Control (визуальный компонент, оживляющий представление DataWindow) и могут быть дополнительные участки кода. Однако с учетом того, что представление DataWindow можно динамически (в том числе и выражения) менять прямо из кода, плюс прямо в язык PB встроена поддержка SQL операторов, то особых сложностей при программирование клиента не наблюдается. У меня есть прекрасно отработанный компонент построения визардов, всю сложную логику ввода и изменения данных я делаю через него, главное преимущество, что нет проблем с вводом данных один-ко-многим, заносим все через визард, нажимаем "Готово", визард автоматом стартует транзакцию и с каждой странички визарда по очереди их DataWindow начинают себя сохранять согласно своим установкам, реагируя на событие странички "Сохранись". Дошли до конца без проблем, визард делает COMMIT. Где то по пути возникла ошибка, ROLLBACK, переход на сбойную страничку и модальное окно с 2 вкладочками сообщений об ошибке - одно для юзеров (с переводом ошибки на понятный язык), второе для меня лично - с полными параметрами вызова ХП, SQLState и SQLCode, а так же полным трайсом последовательности вызова от начала ХП до сбойного места (например, если ошибку триггер сгенерил). Флаги изменения записей у DataWindow не сбрасываются на удачное сохранение, так что пользователь с одной стороны после возникновения ошибки ничего еще в БД не записал, с другой стороны исправив ошибку он еще раз сможет заново попробовать повторить запись в БД. Естественно ошибки логируются, так же для особо нервных пользователей есть кнопочка лично послать мне по мылу. Если же смотреть на самого клиента, то логика в нем чисто интерфейсная - да, я могу согласно логике запрещать/разрешать редактировать какие то поля, даже проверять вводимые значения, если это не напряжно, но все равно последняя инстанция - это БД и триггера, что кстати неплохо контролирует моих кодо-писателей, которые любят сначала писать, потом проверять, а левые данные в БД никому особо не нужны :) Более сложные действия хранятся только в СУБД - например у меня на PB есть компонент организации выбора по фильтру. Так вот он абсолютно ничего не делает - в БД есть таблички со схемами фильтров и запросов, задача этого компонента построить удобоваримый интерфейс для клиента, ориентируясь по описаниям разрезов фильтра (вплоть до организации выбора lookup-полей через список с чекбоксами). Все что юзер в этом компоненте выбирает, PB честно пишет в специальную глобальную временную таблицу. Далее когда все что можно выбрано ... PB запускает ХП на WatcomSQL, которая сама шерстит времянку, строит запрос, соединяя все подзапросы, условия и т.д. и через динамический SQL возвращает id найденных обьектов. В итоге оба молодцы - PB красиво строит интерфейсы, ASA выполняют всю работу по организации работы с данными. Вся прелесть в том, что оба средства позволяют строить динамический интрепретируемый язык - WatcomSQL на стороне сервера, DataWindow на стороне клиенте. Но большая заслуга ASA - это ее оптимизатор, который разворачивает построенный для фильтра довольно большой и по любому неуклюжий запрос, который состоит из кучи соединенных подзапросов в красивый план так, как будто бы он ручками был написан лично мною. Плюс здорово пригождаются всякие фичи типа KEY JOIN (автоматическое соединение по внешним ключам), INSERT ... ON EXISTING SKIP|UPDATE|ERROR (по ключу таблицы), функция LIST (аггрегатная функция сложения в текст) и т.д., что позволяет в нужные моменты генерировать запросы, не сильно напрягаясь с получением метаструктуру и генерации скриптов для различных задач.

То же самое и касается моей технологии построения по шаблонам и макросам - на PB сейчас реализованы DataWindow, позволяющие легко дописывать в публичную библиотеку макросов новые макросы, расставлять дополнительные аттрибуты по таблицам и полям, и т.д. Компиляция же шаблона в готовую ХП, которая уже и будет генерить нужную информацию занимаются всего 12 ХП на WatcomSQL, причем без разницы что генерить по шаблону - скрипт на SQL, HTML, XML, файл с разделителями или текстовый отчет - есть типовые шаблоны, в них есть секции, в том числе и вложенные, есть автоматическая поддержка организации цикла для указанного запроса по секции, есть локальные переменные и область их видимости в секциях, есть возможность управлением генерации контента посредством WatcomSQL прямо внутри шаблона (аналог ASP), есть поддержка макросов, позволяющих описывать и повторно наследовать язык хранимых процедур и конструкции языка запросов (я очень долго думал, как до этого можно дойти, не один год) для диалекта шаблона SQL или описывать расширения или новые тэги для того же диалекта HTML. Сейчас я вот потихоньку неспеша подумываю ввести в поддержку своего генератора по шаблоном нового диалекта - DataWindow expression, в принципе текстовое представление DataWindow очень смахивает на XML, да и описания на XML новый PB воспринимает, было бы неплохо, если бы WatcomSQL не только скрипты или HTML генерил, но и мог автоматом в БД выстраивать и в дальнейшем синхронизировать представления DataWindow, ничего сложного в этом особо не вижу, это только вопрос времени и необходимости, сначала нужно повертеть все в разные стороны и прикинуть, а стоит ли такая овчинка выделки, это ведь придется дальше расширять свою поддержку метаструктуры уже на уровне колонок таблиц, представлений и ХП, плюс рисовать собственный дизайнер DataWindow, который благодаря широким возможностям PB делается то элементарно (у компонент PB есть поддержка в рунтайм таких свойств, как Resize, Move, Title и т.д., так что дизайнер форм или DataWindow - это не проблема), но пока это для моего проекта не актуально и вроде пока DataWindow и ручками через родной дизайнер рисуются неплохо :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32733087
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Все пришли к выводу, что на клиенте бизнес-логику хранить не хорошо (и слава богу). Клиентское приложение должно красиво рисовать рюшечки, гриды, отчеты и вообще вести простой и безоблачный образ жизни :)

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

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


Ее отдельные ф-ии лучше писать на средствах наиболле пригодных для реализации во всех отношениях. Ясно, что на Дельфи некоторые клиентские вещи лучше реализуемы, чем на ХП. А для чего, а для некоторых задач, связанных с данными лучше ХП.

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



ASCRUS
- использование встроенного языка хранимых процедур СУБД позволяет в полном обьеме, достаточно легко и полнофункционально реализовать все, что перечесленно в этих 3-х пунктах


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


ASCRUS
Способ создания слоя бизнес-логики № 2
- использование апп-сервера и высокоуровнего ООП языка.


Высокоуровневый ООП язык не помешает и в первом способе создания бизнес логики. Если не в БД, то на клиенте. Будь он в БД, может больше ф-ий логики приложения перешло бы в БД.


ASCRUS
Из этого вопроса возникает следствие - все мы программируем как минимум на 3-х звеньях, отделяя данные, бизнес-логику и клиента. Только одним нравиться это делать по SQL-ному, так как если посмотреть триггера и ХП, то окажется, что там от алгоритмического языка маловато будет - все запросы, да запросы. А другим нравиться все на классах, контейнерах и компонентах делать. Из сего вывод - сравнивать 2-х и 3-х звенку в данном контексте бестолку, давайте уж сравнивать подходы - алгоритмически-запросные и ООП-компонентные.





Можно и так сказать. Но есть и другие варианты. Кто-то в виде проектировщика пытается найти оптимальное решение и не только техническое, но и финансовое. А возможно и экономическое, т.е. заранее планирует дальнейшее развитие проекта. И тут дай ему Бог помощи не ошибиться с выбором арихитектуры.

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

Вообще-то ООП относится к алгоритмическим в целом пока еще. Может в ООМД появился непроцедурный ODL. И врядли ООП будет плохо дополнять ХП.
То что там много запросов, так на то он и язык БД, чтобы с данными работать и на то успешность РМД, чтобы так все и было. ХП в основном для поддержки его.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32733100
andsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многие из тех кто написал в этот топик почему-то противопоставляют многозвенку и использование ХП. Я программирую многозвенки, но при этом всегда размещаю обработку на том звене где это лучше и проще всего сделать. Если я вижу что проще сделать на ХП и это не противочерчит общему подходу - буду делать на ХП. Иногда встречаются такие программы, архитекторы которых явно ничего не понимают в многозвенках или это их первый опыт - вроде и многозвенка, и вроде все правильно реализовано, но тормозит жутко. Встречал систему, многозвенку, которая любой отчет считала несколько часов, да и вообще медленно работала, из-за очень нерационального использования ресурсов. После улучшения архитектуры стала считать отчеты за секунды. Вот только улучшение архитектуры и изменение программы заняло около полугода при 20 разработчиках. При создании многозвенок цена ошибок заметно выше чем для клиент-сервера.
Про независимость от СУБД - такие требования даже к системам с многозвенкой предьявляются нечасто, обычно можно использовать все возможности СУБД.
На мой взгляд использовать многозвенки имеет смысл в первую очередь там где есть сложная бизнес-логика. На клиент-сервере, из моего опыта, тоже самое просто сложнее реализовать - многие функциональности по отдельности проще сделать на клиент-сервере, но вот чтобы это еще работало - проще сделать на многозвенке.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32733116
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВообще-то ООП относится к алгоритмическим в целом пока еще. Может в ООМД появился непроцедурный ODL. И врядли ООП будет плохо дополнять ХП.
То что там много запросов, так на то он и язык БД, чтобы с данными работать и на то успешность РМД, чтобы так все и было. ХП в основном для поддержки его.
Никто и не против, чтобы для ООМД появился эквивалентный SQL стандарт языка запросов. Наоборот все были бы только за - описывать структуру на классах со всеми вытекающими наворотами ООП гораздо легче и ближе к предметной области, чем физическую модель РСУБД. Дело за малым - должен быть язык для организации DML и DDL, он должен быть интрепретируемым. И главное - нужно иметь эффективный и надежный формат хранения данных, поддержку индексов, транзакционную модель, уровни изоляций и достаточно продвинутый оптимизатор выполнения запросов. Сейчас насколько я понимаю из за более простой и четко структуированной модели хранения данных, РСУБД имеют больше резервов для эволюции в данных направлениях по сравнению с тем же Cache и мне думается что деревья не самый лучший, хотя и наиболее легкий с точки зрения реализации, формат для хранения данных. Ну а современные сервера приложений в моих глазах - это ООП надстройка над РСУБД (может быть я где то и ошибаюсь, но по моему так оно и есть).

IMHO как только ООМД дорастет до собственного привлекательного хранения и обработки данных, тогда и можно будет задумываться о будующем РСУБД. Я лично, как любитель делания всяких интрепретаторов, макрогенераторов и препроцессоров с интересом поглядываю за развитием интрепретируемых ООП языков и тот же Питон для меня имеет довольно много интересных моментов в своем развитии, чем та же Java или C#, у которых и так все понятно :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32733128
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Сейчас насколько я понимаю из за более простой и четко структуированной модели хранения данных, РСУБД имеют больше резервов для эволюции в данных направлениях по сравнению с тем же Cache и мне думается что деревья не самый лучший, хотя и наиболее легкий с точки зрения реализации, формат для хранения данных.



Для меня вопрос о о моделях данных очень важен - так как резкая смена означет необходимость переучиваться. Фактически на сегодняшний день это могут быть: останется РСУБД, либо придет одна из ОРСУБД и ООСУБД, либо они как-то поделят рынок. Думаю, что есть тенденция РСУБД расширения в сторону ОРСУБД, судя по крупнейшим производителям. Если бы ООСУБД побеждала, крупнейшие производители РСУБД переметнулись или создали ООСУБД в параллель. Этого пока не произошло. Cache в качестве ООСУБД даже не всегда упоминается в толстых книгах, а сдругой стороны его сторонники говорят, что кроме ОО он еще и иерархический и даже реляционный и многомерный (что-то похоже на OLAP). В некоторых толстых книгах пишут о крахе идеи ООСУБД (в основном потому, что крупные производители не переметнулись как ожидалось), в других более осторожные оценки.
У крупнейших производителей есть какие-то шаги в сторону универсализма - собрать все хорошее от разных моделей. Конечно, у РСУБД есть много хорошего, поэтому полностью его, наверное, долго не устранят. И область применения, где ее недостатки мало проявляются - Бизнес приложения. А это существенно. Но все же пока будущее моделей не ясно. Однако, ООП, наверное, так или иначе будет прокладывать себе дорогу. А что еще? Вроде ничего другого пока в этом духе не видно на горизонте. Надеюсь, в ОРСУБД.



ASCRUS
Ну а современные сервера приложений в моих глазах - это ООП надстройка над РСУБД (может быть я где то и ошибаюсь, но по моему так оно и есть).

Ну, вроде для РСУБД сервер приложений должен иметь не большее значение, чем клиент в плане ООП. Возможно, раз уж есть сервер приложений, то внешнюю модель данных они вынесли в объектной модели более четко. Если у нас часть модели в БД, а там ХП с процедурной парадигмой, то эта модель не очень просматривается. Но если традиционная двухзвенка, то на клиенте можеет быть тоже ООП, и наваяна объектная внешняя модель. Ну может Вы и правы. Но нужно уточнить термин надстройка. Вообще интересная мысль, я не обращал раньше на это внимание.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32746488
Фотография SanyL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. В этом топике много наезжали на тригера + говорили что они перестанут существовать, что их сложно писать, что блин "кода пишут тригера монитор темнеет :))" --- по этому поводу могу сказать одно - тригера (в MS SQL) очень легки в написании (кто писать неумеет ему и простой Select сложен), удобны в применении, и позволяют обеспечить целостность данных разных табл. а также многое другое. Да кстати не то что тригера вырождаются = а даже наоборот скоро и в MySql появятся триггера.
2. ADO - писал(пишу) на Delphi приложения для больших БД = нареканий ни каких не имею, хотя могу тоже самое делать и через ODBC ---- может кто в состоянии объяснить чем плохи эти 2е технологии (не так что блин они там чтото пользуют и вощем тормозят по умолчанию - а подробно теория + примеры личной жизни).
3. MS SQL позволяет получить доступ к БД на низком уровне - это верно... Сам не делал, но друг писал веб интерфейс для какойто канторы у которой база на MS SQL и сам писал под этот интерфейс провайдера...
4. Переносимость = да работает ток под виндой и при чем полную версию MS SQL на профессионал непоставить = но ведь всетаки большинство серьезных контор всетаки работает с виндой!!! Вообще НЕ задавался таким вопросом - тобишь если писал под MS SQL на нем и работало.... Хотя экспорт возможен даже в эксель таблицы...
5. Транзакции - многоли SQL серверов имеют понятие транзакций - или может это тоже абсолютная глупость?
6. Работа с распределенными БД - Репликации - на последнем семинаре по MS SQL который прошел в Москве (вобщемто этот доклад зачитывался много раз) был зачитан доклад посвещенный репликациям = и в том числе было сказано что начиная с MS SQL 2005 репликации будут работать практически без недостатков. Нужныли репликации али нет судите сами.
7. Сравните удобство скажем MS SQL и любой др системы например Oracle. И аналоги EM в других СУБД. И не станем забывать о требовательности Oracle к оперативной памяти.....


Хотелось увидеть грамотный отзыв на этот мой пост..... И перебор систем которым это под силу = а потом подсчитаем количество таких СУБД :))
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32746499
Фотография SanyL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да кстати для решения задачи укрытия данных от конечных пользователей есть представления, с которыми пользователи работают как с таблицами... Зачем для этого процедуры использовать?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32747016
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SanyL
Если это было сравнение с Oracle, то все пункты кроме 4 и7 не ясны в плане превосходства SQL над Oracle. Например, пп.1 - мало ли где легки триггеры в написании. И в чем выражать легкость и сложность?
пп 4 Превосходство Oracle. И оно важное, поскольку меньшая зависимость от платформы имеет значение. Тем более, что на серверах пока Винды еще не захватили 100 % на рынке.
пп 7. Кому как насчет удобства. Если я знаю лучше Oracle, то он мне и кажется удобнее. Наверное речь шла о том, что быстрей освоить с нуля. И то дело наживное. Кроме того, у Оракла достаточный резерв для настроек под конкретные задачи на разных этапах эксплуатации. Ведь если нельзя подкрутить а надо, то насколько это удобно?
Что касается памяти, то тоже не ясно. А где СУБД будет производить все вычисления? И как? Зависит от ИС в которой используется БД. Оракл 8 менее требователен к памяти, чем 9, но все-таки мне 9 больше нравится. А для маленьких задач у Оракла есть и редакции соответствующие. А если корапаративное решение, то там память на серваке все равно в гигабайтах меряется. Сколько нужно памяти серверному процессу для сортировки сотен мегобайт?
Не очевидно, что пречеслино все необходимые для сравнения показатели.
Например, про кластеры ничего не сказано.
Кроме того, мы заинтересованы в своих СУБД, и врядли можем достаточно объективно их сравнить. Еще нужно знать хорошо обе СУБД и иметь опыт участия во многих проектах.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32749422
Фотография SanyL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, я не пытался сравнить мс сиквел с ораклом.... и по поводу того что трудно быть адекватным (оракл 2е недели всего как интересовать меня стал) я согласен... = просто пытался сказать в защиту мс сиквела и АДО и прочей дребедени = а то в топике столько наездов на это все было...а главное что голословных наездов... и даже скажу более - я признаю оракл более мощной СУБД чем мс сиквел (это мое интуитивное и необоснованное мнение)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32750649
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже признаю Оракл более мощной БД, чем MS SQL, но только при использовании Оракловых кластеров

-- Tygra's --
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32750987
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, естественно, тоже пока признаю Оракл более мощной. Но интуитивно. И признавал, когда работол (не долго с MS SQL 7). Но по слухам.
Помню, что тогда меня разочаровало то, что при написании триггеров, для того, чтобы узнать значение поля изменяемой таблицы до изменения и после во время транзакции, нужно просматривать было специальные таблицы updated и deleted. Но если в одной транзакции меняется много значений поля одной таблицы, то чтобы узнать что на что поменялось нужно как-то соединять эти специальные таблицы. В результате возникли трудности с реализацией каскадного обновления. Чтобы проверить как правильно, я предложил ERWIN сгенерить такой триггер.
Он сгенерил триггер, который работал только при изменении одной записи, а в случае обновления нескольких записей выдавал исключение. А поскольку у потомка может быть еще потомок, то в общем случае должно обновляться несколько записей.
Когда увидел, что у Оракла есть псевдоколнки, в которых есть старое и новое значение весьма обрадовался.
Впрочем, это детали конечно. Это не главное. Да и когда это было.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751077
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так у кого были проблемы с тригерами? У MS SQL или Oracle? Если у MS SQL то там во-первых никогда таблицы updated не было, во-вторых ничего никуда отсоединять не надо...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751134
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очевидно проблемы у MS SQL.

таблица называется inserted, а не updated.

Ну ошибся человек - с кем не бывает.

Проблема сопоставления записей в inserted & deleted действительно есть, но
только в случае изменения первичного ключа и обновления нескольких записей одним UPDATE-ом.

Сколько их ни просили сделать "псевдоколонку" типа ROWID - ни в какую, кое-кто даже предполагал что они боялись в какие-нть темные углы кода унаследованного от Sybase лезть ;-)
До сих пор кста не сделали!

Однако если использовать identity в качестве первичного ключа, то можно смело соединять inserted и deleted - сопоставление однозначное ибо первичный ключ не меняется.

Так что тут не MS виноват - а ручки что базу рисовали ;-)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751147
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri
Так у кого были проблемы с тригерами? У MS SQL или Oracle? Если у MS SQL то там во-первых никогда таблицы updated не было, во-вторых ничего никуда отсоединять не надо...


Ну уже забывать стал. Вместо updated была inserted. Но не в названии дело, а способе получения инфы про то, что на что изменилось. Проблемы были у меня при решении той задачи c каскадными обновлениями на MS SQL. В Оракле эту инфу получить проще. Там есть псевдоколнки OLD и NEW, в которых соответственно значение до и после измения.
Не отсоединять а соединять. Т.е. если
А B
1 e
2 g
и транзакция меняет 1 на 8 и 2 на 7, то для того, чтобы во время транзакции в триггере узнать, что 1 изменилось на 8, а не на 7, то надо соедентиь inserted и deleted по полю B. Однако, в ообщем случае это поле должно быть уникальным. Для того, чтобы убедиться, что других вариантов нет я предложил этот триггер сгенерить ERWIN. Потом предложил и для Оракле.
В первом случае сгенеренный триггер работает, только если меняется одна запись (в deleted - одна запись и тогда соединять, естественно, не надо), а во вотором (на Оракле) для любого кол-ва изменяемых записей.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751176
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoПотом предложил и для Оракле.
В первом случае сгенеренный триггер работает, только если меняется одна запись (в deleted - одна запись и тогда соединять, естественно, не надо), а во вотором (на Оракле) для любого кол-ва изменяемых записей.
Я конечно не претендую на роль знатока Оракла, но по моему там триггеров EACH STATEMENT с возможностью доступа к изменяемой информации нет, все только позаписные (EACH ROW) ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751258
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoВ Оракле эту инфу получить проще. Там есть псевдоколнки OLD и NEW, в которых соответственно значение до и после измения.
Пожалуй, все-таки, это не псевдоколонки, а, если угодно, псевдозаписи.

ASCRUSЯ конечно не претендую на роль знатока Оракла, но по моему там триггеров EACH STATEMENT с возможностью доступа к изменяемой информации нет, все только позаписные (EACH ROW) ?Именно так.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751292
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗоринАндрей & vadiminfo

Однако, в ообщем случае это поле должно быть уникальным.
Да согласен, только я никогда не изменял первичный ключ - так что эти таблицы мне всегда казались очень удобным способом обработки изменившихся данных - и уж точно не недостатком
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751314
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так а я о чем?!
При грамотном дизайне - проблем нет.
Классическое -> Doctor, doctor, it hurts when I do that.... ... then don't do that.

но все равно - невозможность сопоставить какая запись в inserted какой записи в deleted соответствует - недостаток, однозначно!
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751335
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Я конечно не претендую на роль знатока Оракла, но по моему там триггеров EACH STATEMENT с возможностью доступа к изменяемой информации нет, все только позаписные (EACH ROW) ?

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

PL99
Пожалуй, все-таки, это не псевдоколонки, а, если угодно, псевдозаписи.

Верно. Конечно, это псевдозаписи. У меня сегодня тяжелый день все время ошибаюсь.

ЗоринАндрей
При грамотном дизайне - проблем нет.
Классическое ->Doctor, doctor, it hurts when I do that.... ... then don't do that.

но все равно - невозможность сопоставить какая запись в inserted какой записи в deleted соответствует - недостаток, однозначно!

Действительно, я тоже считаю, что в большинстве случаев желательно избегать изменения первичного ключа. Но у проектировшика может быть выбор.
Хотя это уже больше из области проектирования, но все-таки иногда естественный ключ может дать выгоду и при использовании в ограничениях ссылочной целостности.
Представьте три таблицы - Договор, Этап договора и Исполнитель договора. И известно, что в большинстве тяжелых запросов по квартальной и годовой отчетности нужно много данных из второй и третьей таблы, а из первой только номер договора. При этом известно, что номера договоров крайне редко меняются. Тогда Номер договора в качестве первичного ключа в первой табле и внешнего во второй достаточно привлекателен: во многих запросах не будет "лишнего" соединения первой и второй таблиц. А ведь наша цель как можно больше упростить получение необходимой информации.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751343
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПредставьте три таблицы - Договор, Этап договора и Исполнитель договора. И известно, что в большинстве тяжелых запросов по квартальной и годовой отчетности нужно много данных из второй и третьей таблы, а из первой только номер договора. При этом известно, что номера договоров крайне редко меняются. Тогда Номер договора в качестве первичного ключа в первой табле и внешнего во второй достаточно привлекателен: во многих запросах не будет "лишнего" соединения первой и второй таблиц. А ведь наша цель как можно больше упростить получение необходимой информации.

Это все теория. А на практике может оказаться что сканирование относительно небольшой таблицы договоров по индексу плюс джойн по эффективному суррогату будет быстрее чем сканирование больших таблиц (да еще и немного "распухших" из-за включения номера договора в каждую запись).
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751398
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шо, таблицы inserted и updated не нравятся ? А сообщение table is mutating вам нравится ? Видать, не пробовали вы никогда триггера-то серьезные на Оракле писать, кто ж там даст-то из таблицы читать в триггерах строчных :) А из statement-level - это чтобы понять что изменилось надо все поля всех строк таблицы куда-то аккуратно до скинуть, а после с этим до сравнить. Добрая задача если записей эдак тыщ 100, такой триггер всякий юзер одобрит.

Я вовсе не планировал Оракл демонизировать тем что выше написано, я только хочу сказать что лично мне как ни странно MS-ные триггера нравятся больше, чем Оракловые, как раз из-за того что там можно работать в statement-level с таблицей изменений... а если мне понадобится row-level, курсорчик объявлю, не маленький. Вот наличие отсутствия before triggers - это конечно позор, можно instead of-ами эмулировать, но позор все равно :) Авось сделают когда-нибудь
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751534
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex.Czech
Шо, таблицы inserted и updated не нравятся ? А сообщение table is mutating вам нравится ? Видать, не пробовали вы никогда триггера-то серьезные на Оракле писать, кто ж там даст-то из таблицы читать в триггерах строчных :)

Вроде выше писал, что из триггеров на уровне строки читать изменяемую таблу нельзя и почему. И вопросы звучат так что, если бы были inserted и updated, то всегда можно было бы получить ту инфу, которою не удается получить из-за table is mutating? Не уверен. Более того, начал с той ситуации, когда возникли трудности. Однако, у Оракла есть механизм автономных транзакций, который если уж так надо позволит прочитать таблу и из такого триггера, конечно, разработчик сам должен на себя взять ответственность за такую транзакцию.
Может и не писал серьезных триггеров, и даже не знаю что понимается под серьезными триггерами. В литературе такого понятия не встречал еще.
Alex.Czech
А из statement-level - это чтобы понять что изменилось надо все поля всех строк таблицы куда-то аккуратно до скинуть, а после с этим до сравнить. Добрая задача если записей эдак тыщ 100, такой триггер всякий юзер одобрит.

А что же Вы тогда спрашивали про то - нравится ли table is mutating?
Т.е. нет возможности читать про таблу из тыщ 100 из триггеров строчных, причем столько раз сколько записей изменяется. Однако, в общем случае триггера на уровне инструкции и записи могут взаимодействовать. Т.е. триггер на уровне записи может сбросить куда-то что изменилось, а триггер на уровне записи с этим что-то делать. Поэтому остаются разные варианты как триггеру на уровне инструкции узнать что и на что изменилось.

Alex.Czech
Я вовсе не планировал Оракл демонизировать тем что выше написано, я только хочу сказать что лично мне как ни странно MS-ные триггера нравятся больше, чем Оракловые, как раз из-за того что там можно работать в statement-level с таблицей изменений... а если мне понадобится row-level, курсорчик объявлю, не маленький.

Я тоже не собирался демонизировать ничего и MS SQL в частности. Просто мы в любом случае коллеги и должны обмениваться своими знаниями, мнениями, сомнениями и т.д.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751691
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если я буду на каждую реплику отвечать, а потом вы на каждый ответ, то мы жестоко погрязнем :) Я хотел сказать вот о чем: допустим, мы имеем обычную ситуацию когда по изменению таблицы с деревом (есть поле ID, есть поле ParentID) мне нужно перестроить таблицу-акселератор (есть поле ID, есть поле AncestorID, есть поле Level). Триггер на DELETE для этой задачи выглядит одинаково и в Оракл и в MS SQL, а вот триггеры на INSERT и UPDATE в Оракл представляют собой набор из 3(!) триггеров+дополнительного package-а. Вот за это я и люблю больше триггеры MS SQL. Я не так много хочу от Оракла на самом деле - пусть будут строчные триггера, пусть можно будет в них менять значения вставляемые, это несомненно очень удобно. Но я хочу блин видеть в statement-level триггере какие конкретно строчки изменились в каком бы то ни было виде, иначе все на что он годен это массивчики обнулять которые в after-триггере обработаются или тупые сообщения типа "ой, insert сработал" в лог писать.

Автономные транзакции - это вообще чаще всего граната которую в руки обезьяне сунули (ничего личного, это я не вас имею в виду). Я про них прикладным программистам нашим ничего не рассказываю и надеюсь что они ничего про них сами не разузнают :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751711
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alex.Czech
Наверное, то я что я сказал про inserted и deleted не совсем так прозвучало как я хотел. Мне не они не нравились, а то что кроме них не было другого простого способа получить инфу. Я про ERWIN потому и упомянул, что искал другой способ. Конечно, чем больше инфы, тем лучше. Но, наверное, плата за такие структуры производительность системы. Возможно для версионника большая плата за такую инфу что в inserted и deleted , чем для блокировочника. Однако псевдозаписи NEW и OLD не просто удобны - это важная инфа, получать которую желательно как можно проще.

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

И среди них автономные транзакции. Ведь они позволяют, например, аудитить неудачные попытки изменения данных. Этого раньше не было. Этого хотели и получили.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751726
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Псевдозаписи NEW и OLD можно легко получить при помощи курсора (в MS SQL). Псевдотаблицы inserted и deleted чтобы получить (в Oracle) надо написать 3 триггера, и в итоге в триггере before все равно ты их не получишь вообще никак (то есть ситуация такая же что и в MS SQL)

В итоге получается что все пресловутые преимущества Oracle над MS SQL по части триггеров for each row - это лабуда.
Правда, есть одно "но" - я не затрагиваю здесь вопросы производительности. По той простой причине что не производил сравнительных тестов. Я знаю что триггеры с курсорами внутри на MS SQL очень сильно замедляют внесение изменений в таблицу. Но вот насчет Oracle ничего не могу сказать
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751832
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хе хе - в ASA поступили красивее - сделали и триггеры BEFORE, AFTER FOR EACH ROW с NEW и OLD , и триггеры AFTER FOR EACH STATEMENT с Inserted и Deleted. Получилось и удобно и гибко. И даже для тех, кто привык работать с Oracle или MSSQL привычно :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751843
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот и молодцы ! Не знал, спасибо :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751942
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex.Czech
Псевдозаписи NEW и OLD можно легко получить при помощи курсора (в MS SQL). Псевдотаблицы inserted и deleted чтобы получить (в Oracle) надо написать 3 триггера, и в итоге в триггере before все равно ты их не получишь вообще никак (то есть ситуация такая же что и в MS SQL)

Псевдозаписи NEW и OLD легко можно получить с помощью курсора? Нет спасибо. Они слишком часто и в разных ситуациях нужны, чтобы париться с куросорами каждый раз.
Чтобы получить структуры типа inserted и deleted для триггера на уровне инструкции нужен всего один триггер на уровне записи, который будет сбрасывать NEW и OLD в эти структуры. Конечно, нужны процедуры пакета, например, если эти структуры реализуются с помощью коллекций. Специально проверил - написал и протестировал. Или я не понял о чем Вы, когда говорите про три триггера.
Однако, остается вопрос как часто нужны inserted и deleted, если есть псевдозаписи NEW и OLD. Зато другие структур с инфой об изменениях, в которых ясно что на что изменено в каждой записи приходится время от времени реализовывать.

Alex.Czech
Правда, есть одно "но" - я не затрагиваю здесь вопросы производительности. По той простой причине что не производил сравнительных тестов. Я знаю что триггеры с курсорами внутри на MS SQL очень сильно замедляют внесение изменений в таблицу. Но вот насчет Oracle ничего не могу сказать

Так это одно "но" перевесит тысячу других улик (К/ф "Место встречи изменить нальзя").

Alex.Czech
В итоге получается что все пресловутые преимущества Oracle над MS SQL по части триггеров for each row - это лабуда.

Нет, пока еще ничего не получается. Кому как. Кому преимущества, кому нет.
Тем более нет уверенности, что это единственный вопрос об их отличии.

ASCRUS
Хе хе - в ASA поступили красивее - сделали и триггеры BEFORE, AFTER FOR EACH ROW с NEW и OLD , и триггеры AFTER FOR EACH STATEMENT с Inserted и Deleted. Получилось и удобно и гибко. И даже для тех, кто привык работать с Oracle или MSSQL привычно :)

Что ж, если при этом она ни в чем типа производительности не потеряла, то рад за Вас.
ASA блокировочник или версионник?
Надеюсь, что и Оракл так поступит. Но, боюсь, они заняты более глобальными новшествами.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751952
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo ASCRUS
Хе хе - в ASA поступили красивее - сделали и триггеры BEFORE, AFTER FOR EACH ROW с NEW и OLD , и триггеры AFTER FOR EACH STATEMENT с Inserted и Deleted. Получилось и удобно и гибко. И даже для тех, кто привык работать с Oracle или MSSQL привычно :)

Что ж, если при этом она ни в чем типа производительности не потеряла, то рад за Вас.
ASA блокировочник или версионник?
Надеюсь, что и Оракл так поступит. Но, боюсь, они заняты более глобальными новшествами.
Производительности не потеряла. Наоборот как раз из за того, что она блокировочник - выиграла. Дело в том, что в ASA при реализации любой функциональности ее разработчики очень тщательно продумывают модель реализации, анализируя опыт других РСУБД и вводя и ориентируясь на особенности развития ASA. Например в ASA так же как и в Оракле в BEFORE триггерах можно изменять значения полей для вставляемых и изменяемых записей. Соотвествующе само собой проверки на NOT NULL, FOREIGN KEY, CHECK, UNIQUE и т.д. будут выполнены СУБД только после выполнения триггеров, что например развязывает руки разработчикам в некоторых деликатных ситуациях и в то же время не вынуждает их к использованию жесткой парадигмы всех изменений только через ХП. С другой стороны с учетом того, что BEFORE триггера выполняются прямо в процессе во время физического изменения таблицы и блокировании записей, то любой откат из такого триггера гарантирует остановку операции, что убирает лишние нагрузки по физической записи в БД и лог, потерю лишнего времени на откат транзакции и блокировку множества записей. Действительно исходя из здравого смысла - если я оператором UPDATE изменяю миллион записей и на первой же из них мой триггер решает, что операция недопустима - легче сделать откат этой записи, со снятием с нее блокировки, чем сначала проводить физические операции над миллионом записей с их блокировкой, а потом делать долгий откат. В этом плане лично я считаю у ASA действительно реализовано множество правильных с точки зрения архитектуры СУБД решений, с одной стороны не ограничивающих разработчиков, а с другой позволяющих этой СУБД быть действительно шустрой, маленькой, самоадминистрирующейся и с довольно умным саморазвивающимся оптимизатором. Правда вот в некоторых случаях его хрен обманешь даже корреным переписанием запроса с целью изменения плана запроса, благо если оптимизатор действительно не прав, достаточно написать к ним на форум и через пару месяцев получить исправление заявленных ошибок и неточностей в СУБД. С учетом того, что фактически только последняя 9-ая версия стала использоваться на проектах с миллионами записей, что дает оптимистические надежды на рост в области SMB-решений, то за год почти в каждом ежемесячном паке было выложено только для одного оптимизатора 5-10 расширений в области добавления и улучшения алгоритмов обработки информации. Появились различные виды алгоритмов hash-соединений, рекурсивных, OLAP (полный аналог Оракловских OVER ... PARTITION BY ...), даже видел аналог автоматического построения индекса, где маленькая таблица во времянку сортируется по нужным полям и проводиться соединение с большой, которую оптимизатор счел гораздо выгоднее отсканить по кластерному ключу, чем соединять ее по существующему индексу с маленькой табличкой. Так же радует ведение кэша наиболее удачных планов запросов и ХП физически в самой БД, что позволяет во время перезагрузки БД или сервера за считанные секунды не только снова включить его в работу, но и сразу эффективно начать обработку поступающих запросов без нового цикла анализа и выявления наиболее оптимальных планов запросов по текущему состоянию информации БД. Ну а со статистикой проблема решена просто и эффективно - после построения плана запроса и его выполнения оптимизатор передает данные эврестическому анализатору, который в фоновом режиме сравнивает план и факт, корректирует статистику по тем таблицам, где она уже устарела, оставляет оптимизатору запросов информацию по рекомендациям о соединениях, плюс занимается выявлением наиболее оптимальных планов запросов, составляя коллекцию планов с наиболее легкой стоимостью и в случае их частого успешного попадания, навязыванию оптимизатору запросов использование этих планов, где оптимизитор не строит более запросов, пока эврестический анализатор не увидит большого расхождения между планом и фактом (что произойдет при изменении информации) и снова не заставит оптимизатор заниматься построением планов запросов. Тут стоит отметить что в ASA нет понятия компиляции ХП и других обьектов с планами запросов с физическим сохранением в БД - это происходит динамически во время старта БД, что убирает необходимость в случаях изменения информации заниматься пересбором статистики и перекомпиляции ХП. С другой стороны сама компиляции ХП и других обьектов действительно занимает микросекунды, уж не знаю как они этого добились - решения Watcom-а вроде как всегда слыли не самыми медленными, но проблем со скоростью в области компиляции ХП или динамического SQL не наблюдается совсем, что дает так же дополнительные возможности разработчикам на базе динамического SQL.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32751981
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну как откуда 3 триггера... один BEFORE statement - список чистит, второй FOR EACH ROW - значения в список складывает, третий AFTER statement - собственно всю балалайку запускает в работу.

Зачем нужны inserted и updated...ну как зачем. В лог если нужно записывать изменения в базу вносимые, вы из триггера for each row это будете делать ? Оно хорошо, если записи по одной изменяют, а если когда как получится, то вот и проигрыш в производительности (гипотетически, повторюсь что не сравнивал).

Насчет "париться с курсорами" разработчику Оракл должно быть стыдно такие слова произносить вообще, я считаю :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32753838
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex.Czech
Ну как откуда 3 триггера... один BEFORE statement - список чистит, второй FOR EACH ROW - значения в список складывает, третий AFTER statement - собственно всю балалайку запускает в работу.

Ну Вы написали, что надо 3 триггера, чтобы получить. Триггер AFTER statement не получает а только использует, как использовал бы в MS SQL deleted и inserted. Триггер инициализации списка BEFORE может тоже не всегда нужен, например, если список сбрасывается во временные таблы, они могут очищаться при завершении транзакции. Ну, хорошо, посчитаем его. Два триггера нужно для получения.

Alex.Czech
Зачем нужны inserted и updated...ну как зачем.

Я спрашивал не за чем, а как часто, если есть NEW и OLD. Если бы была острая потребность, думаю, Оракл бы их все-таки поддерживал.
Alex.Czech
В лог если нужно записывать изменения в базу вносимые, вы из триггера for each row это будете делать ?

В зависимости от задачи. В общем случае в Ораклемогут использовать другие механизмы типа Streams.

Но если опять понадобиться инфа что на что заменили в этих журналах. Например, аудите. Что Вы будете делать? Создавать дополнительные уникальные спец колонки для соединений inserted и deleted?

Alex.Czech
Насчет "париться с курсорами" разработчику Оракл должно быть стыдно такие слова произносить вообще, я считаю :)

А что же вы не хотите три триггера вместо одного писать? Все лучше смотрится чем курсор для NEW и OLD. И что скрывается за этим курсором? Запрос? Ведь NEW и OLD нужны в триггере на уровне записи, который выполняется столько раз, сколько записей изменяется. Столько раз курсоры открывать и запросы выполнять? Да и если они часто нужны, то не замусорят ли эти курсоры - код? Ведь если список для inserted и deleted ассоциативный массив, то даже неявные курсоры не используются при их инициализации и получении. А кол-во открытых курсоров имеет значение для сервера в плане ресурсов.
Что каксается стыда для разработчика то, так можно устыдиться и писать на чем либо кроме ассемблера. Было и такое в истории - Настоящий программист пишет только на ассемблере:)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32753858
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА что же вы не хотите три триггера вместо одного писать? Все лучше смотрится чем курсор для NEW и OLD. И что скрывается за этим курсором? Запрос? Ведь NEW и OLD нужны в триггере на уровне записи, который выполняется столько раз, сколько записей изменяется. Столько раз курсоры открывать и запросы выполнять? Да и если они часто нужны, то не замусорят ли эти курсоры - код? Ведь если список для inserted и deleted ассоциативный массив, то даже неявные курсоры не используются при их инициализации и получении. А кол-во открытых курсоров имеет значение для сервера в плане ресурсов.
Вообще то AFTER FOR EACH STATEMENT выполняется только один раз на все изменения, которые и содержаться в таблицах Inserted и Deleted. И если мне например после изменения информации в таблице необходимо пересчитать другую информацию в таблице, то в триггере AFTER UPDATE FOR EACH STATEMENT достаточно написать:
Код: plaintext
1.
2.
3.
4.
UPDATE Table1 t1
SET Value = Value + i.Value - d.Value
FROM Table1 t1
  INNER JOIN Inserted i ON i.id = t1.id
  INNER JOIN Deleted d ON d.id = t1.id;
и почему то у меня есть подозрение это сработает гораздо быстрее, чем если бы я на миллион записей навесил FOR EACH ROW и на каждую из миллиона записей выполнял UPDATE, Вам не кажется ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32753886
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
и почему то у меня есть подозрение это сработает гораздо быстрее, чем если бы я на миллион записей навесил FOR EACH ROW и на каждую из миллиона записей выполнял UPDATE, Вам не кажется ?

Может я не совсем понял про какие Вы миллион UPDATE? После того как deleted и inserted сформированы, если они нужны, я могу использовать Ваш пример. (Хотя не совсем его понял) Т.е. до AFTER FOR EACH STATEMENT я их уже получил. Или Вы про само получение deleted и inserted? Это те два триггера BEFOR FOR EACH STATEMENT (инициализация) и BEFORE FOR EACH ROW. Я писал, что там может не быть вовсе неявных курсоров, в частности UPDATE. Там BEFORE FOR EACH ROW может просто записывать псевдозаписи в коллекцию ассоциативный массив - пременная PL/SQL (просто присвоения). Т.е. ни в БД. Инициализация при первом запуске вообще ничего не стоит - коллекция еще пустая. Поэтому там есть миллион присвоений (относительно примитивных записей в ОП). Ну, как например, соотносятся записи в коллекцию по сравнению с записями измнений собственно данных в блок БД (с которыми связаны более сложные алгоритмы, и часть блоков вообще может еще не быть в ОП)? Не уверен, но мне кажется, что запись в коллекцию добавит не много процентов. Ну и от объема памяти тоже кое-что зависит. А триггер AFTER FOR EACH STATEMENT использует эту коллекцию как deleted и inserted. Но вместо них можно получить, например, updated, где видно что на что заменено.
Не сомневаюсь, что можно придумать ситуации где deleted и inserted очень бы подошли. Возможно, была бы еще полезна структура updated, где видно что на что заменено. Да и наверное еще много чего.
Я говорил, что не против если бы были deleted и inserted, но мне пока все еще кажутся более важными псевдозаписи NEW и OLD.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32753940
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой пример означает, что когда я делаю:
Код: plaintext
1.
UPDATE Table2
SET Value = Value -  100 ;
где в таблице Table2 обновляется миллион записей, после их обновления будет один раз вызван триггер AFTER UPDATE FOR EACH STATEMENT, который произведет обновление в аггрегирующей таблице Table1, вычитая с нее старые суммы Table2 и прибавляя новые. В своем примере я не очень вижу какие то курсоры. И мне не надо делать ручками какие то коллекции, заполнять их на AFTER FOR EACH ROW и обрабатывать потом на AFTER FOR EACH STATEMENT.

авторВозможно, была бы еще полезна структура updated, где видно что на что заменено. Да и наверное еще много чего.
Соединение по первичному ключу Inserted и Deleted всегда даст понятие, что на что изменилось. Из чего следует вывод, что данная конкепция отрицает изменение первичного ключа и поощряет использование ИК вместо ЕК (с чем я полностью согласен).

авторЯ говорил, что не против если бы были deleted и inserted, но мне пока все еще кажутся более важными псевдозаписи NEW и OLD.
Ну мне в этом плане легче, так как есть и то и то :) Остается это только с умом использовать в различных ситуациях :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754122
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSХе хе - в ASA поступили красивее - сделали и триггеры BEFORE, AFTER FOR EACH ROW с NEW и OLD , и триггеры AFTER FOR EACH STATEMENT с Inserted и Deleted. Получилось и удобно и гибко. И даже для тех, кто привык работать с Oracle или MSSQL привычно :)

В DB2 все это было с 5 версии.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754132
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSМой пример означает, что когда я делаю:
Код: plaintext
1.
UPDATE Table2
SET Value = Value -  100 ;
где в таблице Table2 обновляется миллион записей, после их обновления будет один раз вызван триггер AFTER UPDATE FOR EACH STATEMENT, который произведет обновление в аггрегирующей таблице Table1, вычитая с нее старые суммы Table2 и прибавляя новые. В своем примере я не очень вижу какие то курсоры. И мне не надо делать ручками какие то коллекции, заполнять их на AFTER FOR EACH ROW и обрабатывать потом на AFTER FOR EACH STATEMENT.

авторВозможно, была бы еще полезна структура updated, где видно что на что заменено. Да и наверное еще много чего.
Соединение по первичному ключу Inserted и Deleted всегда даст понятие, что на что изменилось. Из чего следует вывод, что данная конкепция отрицает изменение первичного ключа и поощряет использование ИК вместо ЕК (с чем я полностью согласен).

авторЯ говорил, что не против если бы были deleted и inserted, но мне пока все еще кажутся более важными псевдозаписи NEW и OLD.
Ну мне в этом плане легче, так как есть и то и то :) Остается это только с умом использовать в различных ситуациях :)

А как быть, если на таблицу навешать триггеры сразу и FOR EACH STATEMENT и FOR EACH ROW? :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754151
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman ASCRUSХе хе - в ASA поступили красивее - сделали и триггеры BEFORE, AFTER FOR EACH ROW с NEW и OLD , и триггеры AFTER FOR EACH STATEMENT с Inserted и Deleted. Получилось и удобно и гибко. И даже для тех, кто привык работать с Oracle или MSSQL привычно :)

В DB2 все это было с 5 версии.
И в ASA с 4 версии еще под ДОС (1994 год) :)

авторА как быть, если на таблицу навешать триггеры сразу и FOR EACH STATEMENT и FOR EACH ROW? :)
Как и полагается - для каждой записи в зависимости от порядкового номера будут срабатывать триггера FOR EACH ROW и в конце сработают по порядковым номерам триггера FOR EACH STATEMENT.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754157
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно рассматривать триггеры в рамках единицы работы... а то как бы чего не вышло...))
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754191
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanНужно рассматривать триггеры в рамках единицы работы... а то как бы чего не вышло...))
Не очень понял - чего именно может выйти ? Как спроектируете логику триггеров, так они работать и будут :) Однако думаю все могут согласиться, чем больше у разработчика функциональных возможностей, тем больше у него развязаны руки более правильно спроектировать ту или иную логику работы. Соотвествующе чем меньше возможностей, тем больше решения иногда напоминают садо-мазо с тройным сальто через собственную голову и риском потом об этом пожалеть. Естественно в таких случаях лучше искать другие пути решения задачи, чем пытаться навязать продукту сделать то, что он не умеет, не предназначен или делает это не сильно хорошо. Это легко прослеживается при переходе специалистов с одной платформы на другую (и без разницы какую именно - с Access на Delphi, с MSSQL на Oracle, с Delphi на PowerBuilder и т.д.) - частенько они пытаются навязать привычную для них логику изучаемому продукту, для которого она оказывется противопоказанной. Отсюда все и беды и рассуждения, что вот типа MSSQL плох, а Оракл хорош, потому что в Оракле это есть, а там нет и наоборот соотвествующе :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754223
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос - для чего нужны триггера AFTER? - ответ - основное назначение - изменять производные таблицы. Если делать update миллиона записей, то может либо лог кончиться, либо нарваться на ограничение количества блокировок. Массированные апдейты нужно в любом случае делать пакетами. Быстрее будет и надежнее.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754234
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон, не производные, а зависимые...)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754286
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanЕсли делать update миллиона записей, то может либо лог кончиться, либо нарваться на ограничение количества блокировок.
Странно. Я как-то делал update двадцати, что ли, миллионов - и ни на что подобное не нарвался ;-)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754315
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли делать update миллиона записей, то может либо лог кончиться, либо нарваться на ограничение количества блокировок.
А вот это от реализации сервера и зависит. Где то можно нарваться на ограничения, а где то нет :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754322
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSСоотвествующе чем меньше возможностей, тем больше решения иногда напоминают садо-мазо с тройным сальто через собственную голову и риском потом об этом пожалеть.
Трудно с этим не согласиться.

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

Так что, к сожалению, простого выхода здесь нет. Приходится помнить, что можешь ошибиться и в том, и в другом случае.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754354
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS авторЕсли делать update миллиона записей, то может либо лог кончиться, либо нарваться на ограничение количества блокировок.
А вот это от реализации сервера и зависит. Где то можно нарваться на ограничения, а где то нет :)

Если Update происходит в рамках одной транзакции - запросто - на любом серваке. Если по какой-то причине блокировка на уровне строки или страницы не трансформировалась в блокировку на уровне таблицы - то прийти в итоге к ROLLBACK - элементарно.Особенно когда имеются триггеры. Ведь тогда наверняка блокировки вешаются не на одну таблицу. Эмулировать такое поведение - раз плюнуть. Ну, а нехватка лога - ребята, неужели у вас ни у кого не было log out of space? Не верю... Также не поверю что никогда в жизни при получении декартова произведения в криво написанном запросе вы в tempdb не получали out of space.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754359
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS наверно намекал на то, что в ASA и MSSQL лог может расти автоматически. Но ведь все равно диск когда-нить кончится.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754373
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanЕсли Update происходит в рамках одной транзакции - запросто - на любом серваке. Если по какой-то причине блокировка на уровне строки или страницы не трансформировалась в блокировку на уровне таблицы
(голосом Вероники Маврикиевны) Не все йогурты одинаково полезны.

Лично мне придется очень долго ждать "трансформации" блокировки строки в блокировку таблицы - думаю, помру раньше. А блокировок на уровне страницы вообще не существует.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754398
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer gardenmanЕсли Update происходит в рамках одной транзакции - запросто - на любом серваке. Если по какой-то причине блокировка на уровне строки или страницы не трансформировалась в блокировку на уровне таблицы
(голосом Вероники Маврикиевны) Не все йогурты одинаково полезны.

Лично мне придется очень долго ждать "трансформации" блокировки строки в блокировку таблицы - думаю, помру раньше. А блокировок на уровне страницы вообще не существует.

В DB2 тоже не существует, а вот в Sybase ASE - есть.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754466
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanВ DB2 тоже не существует, а вот в Sybase ASE - есть.
Именно поэтому мне и не понравились слова "на любом серваке".
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754485
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer gardenmanВ DB2 тоже не существует, а вот в Sybase ASE - есть.
Именно поэтому мне и не понравились слова "на любом серваке".

А разве есть серваки, где блокировки на уровне строки отсутствуют?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754501
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerу людей, привыкших работать в какой-то области, оказываются зашорены глаза. Они привыкли делать что-то криво (например, по историческим причинам), и прямое решение уже не приходит в голову.

Так что, к сожалению, простого выхода здесь нет. Приходится помнить, что можешь ошибиться и в том, и в другом случае.
Угу, именно поэтому я взял себе за правило хорошего тона при освоении другого продукта сначала изучать его базовые основы, не сравнивая с тем, что я уже знаю и на чем работал, и только после того, как я увидел его основные черты, тогда начинать сравнение с тем, что я уже хорошо знаю и на найденных различиях строить свое мнение о нем и выявлять наиболее удачные принципы работы с ним. Метод себя хорошо зарекомендовал - например годик назад изучая PowerBuilder, я честно прочитал по нему базовые книги, не обращая внимание на то, что с точки зрения той же Java или Delphi он напоминал неуклюжий утюг и не пытаясь сразу по ходу изучения все автоматизировать, налепить своих классов, подстраивающих его в привычную форму работы (хотя руки и чесались). Сейчас как результат - как оказалось в PB, если смотреть под другим углом, просто прекрасная концепция разделения функций интерфейса через ООП и функций работы с бизнес-логикой и визуальными отображениями через DataWindow. Любые вещи малым кол-вом кода реализуются просто на ура по сравнению с той же Delphi, возможности интрепретируемого языка DataWindow Expression для построения форм, гридов, графиков и отчетов просто шикарные и позволяют делать не только клиентские приложения, но и целые платформы с автоматическим построением визуальных представлений по обьектам БД. Думаю говорить не стоит, что было бы, если бы я попытался на нем программировать в привычной колее - такой результат частенько отслеживается гневными воплями на многих дельфийских форумах народа, которому приходилось встречаться с PowerBuilder :) То же самое можно полностью сказать о любой СУБД, можно между собой сравнить MSSQL и ASE именно как СУБД, но даже ASA с ними сравнивать уже не корректно, так как у нее уже совершенно другая архитектура и соотвествующе другие возможности и другие правила удачного использования. Я в таком случае предпочитаю производить сравнение в ценовом эквиваленте - затраты на закупку СУБД, разработку, сопровождение и стоимость владения, естественно при условии соблюдения выбранной СУБД всех условий по постановке задачи.

авторASCRUS наверно намекал на то, что в ASA и MSSQL лог может расти автоматически. Но ведь все равно диск когда-нить кончится.
А что - миллион записей так уж много весит в эквиваленте дискового пространства ?

авторЕсли Update происходит в рамках одной транзакции - запросто - на любом серваке. Если по какой-то причине блокировка на уровне строки или страницы не трансформировалась в блокировку на уровне таблицы - то прийти в итоге к ROLLBACK - элементарно.Особенно когда имеются триггеры. Ведь тогда наверняка блокировки вешаются не на одну таблицу. Эмулировать такое поведение - раз плюнуть. Ну, а нехватка лога - ребята, неужели у вас ни у кого не было log out of space? Не верю... Также не поверю что никогда в жизни при получении декартова произведения в криво написанном запросе вы в tempdb не получали out of space.
Нет у нас понятия блокировки на уровне страницы и эксколации блокировок. Если ASA что то такое и делает, то никак и никем это не заметно. Это только в MSSQL сделали огромный механизм борьбы с блокировками, который по моему больше мешает, чем помогает. Может быть им вместо него нужно было бы по другому реализовать саму архитектуру блокировок ? И не было у меня проблем с нехваткой лога, на ASA не крутяться террабайтные БД, это СУБД для SMB решений (рабочих групп), сотня гигов - это уже нонсенс для такого решения, а вроде как уже давно на серверах винты не по 10 гб стоят :) И так же у нас нет tempdb, у ASA все динамично, в том числе и временные файлы, которые создаются и удаляются автоматически во время запуска и остановки сервера, что и как хранить временно - это чисто проблемы ASA, что и правильно для СУБД, которая развивается на концепциях интеллектуальной СУБД с нулевым администрированием. Причем это не означает, что она настолько умна, что сама все сделает. Это означает, что для девелопера в ее возможностях есть необходимый запас функционала, позволяющий в момент разработки БД предусмотреть различные ситуации и прописать модели поведения - от оптимизации запросов до разруливания конфликтов репликаций или системных ошибок.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754540
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanА разве есть серваки, где блокировки на уровне строки отсутствуют?
Есть серваки, где блокировки на уровне строки не занимают места. И есть серваки, где механизм эскалации блокировок отсутствует в принципе.

Собственно, само наличие механизма эскалации означает архитектурную проблему, для решения которой пришлось ввести костыль.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754634
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer gardenmanА разве есть серваки, где блокировки на уровне строки отсутствуют?
Есть серваки, где блокировки на уровне строки не занимают места. И есть серваки, где механизм эскалации блокировок отсутствует в принципе.

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

Ага, я представляю себе сервак, в котором отсутствуют сразу все эти компоненты - логи, роллбак-сегменты, блокировки...) эт кажется mysql т.к. там транзакции в принципе отсутствовали.. правда не знаю как сейчас.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754817
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Соединение по первичному ключу Inserted и Deleted всегда даст понятие, что на что изменилось. Из чего следует вывод, что данная конкепция отрицает изменение первичного ключа и поощряет использование ИК вместо ЕК (с чем я полностью согласен).

Точнее данная конкепция не предполагает изменение первичного ключа. Однако, это концепция реализации, а вопрос изменения первичного ключа - вопрос модели данных БД. Т.е. у нас реализация накладывает дополнительные ограничение на модель данных? Причем на существенный вопрос идентификации.
А если NEW и OLD используются для изменения значений в той же табле, Вы по прежнему будете Inserted и Deleted использовать? Делать ручками какие-то запросы.
И про агрегатные таблы - для таких в некотрых случаях лучше подходят материализованные представления.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754861
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoТочнее данная конкепция не предполагает изменение первичного ключа. Однако, это концепция реализации, а вопрос изменения первичного ключа - вопрос модели данных БД. Т.е. у нас реализация накладывает дополнительные ограничение на модель данных? Причем на существенный вопрос идентификации.
Думаю не стоит развивать спор на тему ЕК vs ИК. Даже на форуме MSSQL он стал напоминать лестницу. Могу сказать только одно - в моих базах данных первичные ключи не изменяются и никаких проблем в связи с этим я ни разу не наблюдал.

vadiminfoА если NEW и OLD используются для изменения значений в той же табле, Вы по прежнему будете Inserted и Deleted использовать? Делать ручками какие-то запросы.
Есть такое понятие - каскадные триггеры. Если Вы в AFTER FOR EACH STATEMENT триггере напишите UPDATE "СноваЭтаТаблица", то на этот UPDATE будут заново вызваны все триггеры и для них уже будут свои Inserted и Deleted. И естественно у каждой СУБД будут свои механизмы управления каскадностью.

vadiminfo
И про агрегатные таблы - для таких в некотрых случаях лучше подходят материализованные представления.
Ключевая фраза - " в некоторых ". Думаю ораклисты сильно много по этому поводу спорить не будут. Панацей от всех бед ни в одной СУБД нет, у каждой существуют свои решения, обладающие неоспоримым рядом достоинств и досадным кол-вом недостатков.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32754992
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSДумаю не стоит развивать спор на тему ЕК vs ИК. Даже на форуме MSSQL он стал напоминать лестницу. Могу сказать только одно - в моих базах данных первичные ключи не изменяются и никаких проблем в связи с этим я ни разу не наблюдал.
Развивать, безусловно, незачем - просто стоит отметить факт как недостаток подхода.

Вопрос в том, что время от времени приходится работать с уже реализованными кем-то базами, и как они спроектированы и реализованы - мягко говоря, как повезет. Так, полгода назад мне пришлось чуть работать с базой, в которой редкий первичный ключ состоял менее чем из четырех полей. Рекордом было, по-моему, двенадцать.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755202
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Развивать, безусловно, незачем - просто стоит отметить факт как недостаток подхода.
а мне представляется что как раз продуманная стройная концепция, без излишеств ( моё личное мнение )

softwarerВопрос в том, что время от времени приходится работать с уже реализованными кем-то базами, и как они спроектированы и реализованы - мягко говоря, как повезет. Так, полгода назад мне пришлось чуть работать с базой, в которой редкий первичный ключ состоял менее чем из четырех полей. Рекордом было, по-моему, двенадцать
искренне не понимаю - какие проблемы добавить поле с identity? и это всего-то цена недостатка подхода ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755223
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper
искренне не понимаю - какие проблемы добавить поле с identity? и это всего-то цена недостатка подхода ?

:) А вот действительно - хороший повод для отдельного топика в проктировании - хорошо это или плохо, когда у одной таблицы несколько потенциальных ключей.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755234
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper softwarer Развивать, безусловно, незачем - просто стоит отметить факт как недостаток подхода.
а мне представляется что как раз продуманная стройная концепция, без излишеств ( моё личное мнение )
Одно не противоречит другому. И продуманные, стройные концепции имеют врожденные (generic) недостатки, оставаясь тем не менее продуманными и стройными. Достаточно часто приходится идти на какие-то недостатки, получая за это какие-то (считаемые более важными) преимущества. Это совершенно нормально. Но: такие недостатки надо знать.

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

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

Другой вопрос - что этим достигается. Скажем, если для row-level триггеров сохранятся псевдозаписи :old и :new, а для statement-level триггеров добавлятся псевдотаблицы :inserted, :updated и :deleted - лично я буду только за.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755258
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman А вот действительно - хороший повод для отдельного топика в проктировании - хорошо это или плохо, когда у одной таблицы несколько потенциальных ключей.
"Потенциальный ключ" - несколько странный термин.

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

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

P.S. Уточню, чтобы не было непониманий - когда меня учили теории БД, давали следующие определения:

[unique] key - поле или комбинация полей, значения которых однозначно идентифицируют любую запись в таблице

primary key - произвольно выбранный ключ из числа уникальных

unique constraint - поле/комбинация полей, соответствующих ограничению уникальности, но не являющихся ключом (допускающее комбинацию "все равны null").
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755289
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут кстати ради интереса на ASA взял табличку с 1,5 миллионов записей, накатал на нее триггер AFTER UPDATE FOR EACH STATEMENT, который в родительской табличке с 4,5 миллионов записей выполнял пересчет суммирующего поля:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TRIGGER "test1" AFTER UPDATE
ORDER  1  ON "DBA"."usl_fis"
REFERENCING OLD AS Deleted NEW AS Inserted
FOR EACH STATEMENT
BEGIN
  UPDATE usl_efls e
  SET TotalValue = TotalValue - d.Value + i.Value
  FROM usl_efls e
    INNER JOIN (
      SELECT id_usl_efls, Sum(IsNull(Summ_Nach,  0 )) AS Value
      FROM Inserted
      GROUP BY id_usl_efls
    ) AS i ON i.id_usl_efls = e.id
    INNER JOIN (
      SELECT id_usl_efls, Sum(IsNull(Summ_Nach,  0 )) AS Value
      FROM Deleted
      GROUP BY id_usl_efls
    ) AS d ON d.id_usl_efls = e.id;
END;
потом написал:
Код: plaintext
1.
2.
3.
4.
UPDATE usl_fis
SET Sum_Nach = Sum_Nach +  100 
WHERE Sum_Nach IS NOT NULL; // не моя база

COMMIT;
и оттарабанив 3 минуты на моей машине с загрузом процессора где процентов на 30 в среднем запрос был выполнен успешно вместе с триггером. Нехватки пространства для лога (он вообще для этой тестовой БД установлен с опцией сброса после завершения транзакции), нехватки места под временные файлы, затыкания блокировок или еще какой гадости замечено не было, причем памяти серверу было отведено на винде всего 400 метров, что в принципе под 11 гиговую БД и эти широкие таблички даже маловато будет.

авторМеня скорее удивляет "особая роль" первичного ключа, который ничем особенным не выделяется. То есть, насколько я видел, в теоретических выкладках любят говорить "есть первичный ключ", подразумевая "есть хоть какой-нибудь уникальный ключ".
Полностью согласен с этим. В ASA например FOREIGN KEY можно вешать не только на первичный, но и любой unique constraint. В данном случае первичный ключ обязательно нужен для оператора
Код: plaintext
INSERT INTO Table ... ON EXISTING SKIP|UPDATE|ERROR 
который насколько я понимаю является аналогом Оракловского MERGE.

авторunique constraint - поле/комбинация полей, соответствующих ограничению уникальности, но не являющихся ключом (допускающее комбинацию "все равны null").
А вот тут у нас как раз UNIQUE CONSTRAINT не могут делаться на NULL поля (возможно как раз из за возможности FOREIGN KEY по ним). Для обеспечения уникальности по NULL полям нужно делать UNIQUE INDEX.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755383
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ASCRUS:
если бы в процессе апдейта пришлось корректировать кучу индексов, то ситуация была бы явно иной.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755385
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSПолностью согласен с этим. В ASA например FOREIGN KEY можно вешать не только на первичный, но и любой unique constraint.
В Оракле так же.

ASCRUSВ данном случае первичный ключ обязательно нужен для оператора
Код: plaintext
INSERT INTO Table ... ON EXISTING SKIP|UPDATE|ERROR 
который насколько я понимаю является аналогом Оракловского MERGE.
Похоже. Но в MERGE все задается явно - соответственно ключа не требуется.

ASCRUSА вот тут у нас как раз UNIQUE CONSTRAINT не могут делаться на NULL поля (возможно как раз из за возможности FOREIGN KEY по ним).
Здесь Оракл рубанул как Александр по узлу :) И имхо весьма уместно. Оракл постановил, что foreign key может делаться на null поле и ссылаться на null поле - пользуясь идеологией null: условие a.id = b.id не вернет записей, если хоть один из них равен null. Это очень удобно.

Уникальный индекс тоже можно сделать. Но это нужно в основном для функциональных индексов - например,

Код: plaintext
create unique index T_I on T ( upper ( trim ( text_field )))
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755464
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗдесь Оракл рубанул как Александр по узлу :) И имхо весьма уместно. Оракл постановил, что foreign key может делаться на null поле и ссылаться на null поле - пользуясь идеологией null: условие a.id = b.id не вернет записей, если хоть один из них равен null. Это очень удобно.
Гм напомнили насчет NULL полей, так что посмотрел в BOL - у нас тоже разрешается использовать UNIQUE INDEX в качестве первичного ключа для связи FOREIGN KEY, потому как разрешается делать FOREIGN KEY для NULL-полей. Правда непонятно, почему в UNIQUE INDEX можно использовать NULL-поля, а в UNIQUE CONSTRAINT нет с учетом того, что они вообще ничем в ASA в архитектурном плане не отличаются. Ну а на вычисляемые поля (выражения) можно делать как UNIQUE CONSTRAINT, так и индексы.

Кстати вспомнил, где еще приятные расширения функциональности связей - это KEY соединения в запросах:
Код: plaintext
1.
2.
3.
SELECT *
FROM Table1
  KEY JOIN Table2
  KEY LEFT JOIN Table3 ON Table3.Value IS NOT NULL;
Если на таблицы есть FOREIGN KEY, если он один, то ASA cама соединит по полям вторичного ключа. В ON в данном случае можно дописать дополнительные условия связи. Такой вид связи таблиц в запросах особенно удачен при построении динамических запросов, текста запроса в клиентском приложении и т.д. ... не нужно замарачиваться с поднятием метаструктуры БД для определения полей связи между таблицами, которые должны быть использованы в запросах. С учетом того, что оптимизатор может выкинуть из запроса неиспользованные, но перечисленные таблицы, вплоть до пересоединения (когда table1->table2->table3 вполне можно было в запросе сократить до table1->table3), то появляются неплохие возможности для создания для клиентских частей всяких поисковых и других механизмов по базе данных.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755473
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 softwarer
пользуясь идеологией null: условие a.id = b.id не вернет записей, если хоть один из них равен null
А пользуясь этой чудесной идеологией - мудрый Оракл даст создать несколько записей, содержащих Null в необязательном поле, по которому построен уникальный индекс?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755481
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASA даст и Оракл по моему тоже, исходя из того, что "NULL <> NULL". Хотя это не везде срабатывает, например в ASA для CHECH CONSTRAINT будет верно утверждение "NULL = NULL", сделали специально, чтобы полегче код в них был, все таки этот CONSTRAINT критичный для вставок и обновлений записей.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755494
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
авторА пользуясь этой чудесной идеологией - мудрый Оракл даст создать несколько записей, содержащих Null в необязательном поле, по которому построен уникальный индекс?

конечно, если у вас почему-то NULL == NULL то индекс можно строить по NVL()
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755570
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS Правда непонятно, почему в UNIQUE INDEX можно использовать NULL-поля, а в UNIQUE CONSTRAINT нет с учетом того, что они вообще ничем в ASA в архитектурном плане не отличаются.
Скорее всего потому, что его следовало бы назвать unique key - то есть в данном случае как раз следуют данному мной определению ключа таблицы. А индекс - это реализация.

ASCRUS Кстати вспомнил, где еще приятные расширения функциональности связей - это KEY соединения в запросах:
Хм. Непривычно :) Я как-то предпочитаю явно указывать, что я хочу. Но вполне логично и соответствует идеологии SQL - так что, наверное, соглашусь с положительной оценкой. Во всяком случае, тут уместно вспомнить, что "фичи лишними не бывают".
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755577
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох ПозорныйА пользуясь этой чудесной идеологией - мудрый Оракл даст создать несколько записей, содержащих Null в необязательном поле, по которому построен уникальный индекс?
Даст. В полном соответствии с идеологией. Кстати, интересно было бы посмотреть на задачу, где объективно нужна единственность null в уникальном поле.

P.S. Как Вы вероятно знаете, Oracle экономит место и не хранит в индексах null-овские значения.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755610
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторХм. Непривычно :) Я как-то предпочитаю явно указывать, что я хочу. Но вполне логично и соответствует идеологии SQL - так что, наверное, соглашусь с положительной оценкой. Во всяком случае, тут уместно вспомнить, что "фичи лишними не бывают".
Я в данном случае если таблички и так понятно, что соединяются, пишу KEY JOIN, однако в сложных запросах с вложенными запросами или использовании в них представлений и процедур предпочитаю только стандартный JOIN, иначе можно неявно соединить через KEY JOIN явные таблицы запроса и неявные, используемые в представлении или ХП. Еще удобно KEY JOIN-ами с системных таблиц информацию получать, вот уж где вообще замечательно вместе с ними смотрится аггрегатная функция LIST:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT 'CREATE TABLE Table1 (\n' ||
  List('  ' || c.Column_Name || ' ' || 
    MacroSQL_GetTypeColumn(d.Domain_Name, c.Width, c.Scale) || 
    IF c.Nulls = 'N' THEN ' NOT' ENDIF ||
    ' NULL' ||
    IF c."Default" IS NOT NULL THEN 
      IF c.Column_Type = 'C' THEN 
        ' COMPUTE( ' || c."Default" || ')' ELSE 
        ' DEFAULT ' || c."Default" 
      ENDIF
    ENDIF
   , ',\n' ORDER BY c.Column_id) ||
 '\n);' AS Script
FROM SysTable t
  KEY JOIN SysColumn c
  KEY JOIN SysDomain d
WHERE t.table_name = 'Contract_History' AND creator = User_id();
на выходе получим одну запись с полем Script со значением:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE Table1 (
  Contract_id integer NOT NULL,
  SaveDate date NOT NULL,
  TypeContract_id tinyint NOT NULL,
  Number smallint NOT NULL,
  CloseDate date NULL,
  ContractNumber integer NULL,
  ContractType_id tinyint NOT NULL,
  AdvancePay numeric( 15 ,  2 ) NULL,
  IsAdvancePercent bit NOT NULL,
  c_CloseDate date NOT NULL COMPUTE( IsNull(CloseDate,'2050-01-01')),
  LastUser varchar( 20 ) NOT NULL DEFAULT last user,
  LastTime timestamp NOT NULL DEFAULT timestamp,
  SaveCloseDate date NOT NULL
);
теперь EXECUTE IMMEDIATE и никаких проблем :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755621
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL99 vadiminfoВ Оракле эту инфу получить проще. Там есть псевдоколнки OLD и NEW, в которых соответственно значение до и после измения.
Пожалуй, все-таки, это не псевдоколонки, а, если угодно, псевдозаписи.

ASCRUSЯ конечно не претендую на роль знатока Оракла, но по моему там триггеров EACH STATEMENT с возможностью доступа к изменяемой информации нет, все только позаписные (EACH ROW) ?Именно так.
Не очень понятно, что же именно ТАК.

Oracle предлагает - по выбору разработчика, - триггеры на оператор и триггеры на строку. Причем триггеры разделяются еще и по времени выполнения - ДО оператора, ВМЕСТО оператора, ПОСЛЕ оператора. И это если говорить только о части триггеров - о триггерах пользовательских событий.

В триггере на оператор вы можете сбросить данные в другую таблицу и по окнчанию обработки удалить их (их никто и не увидит, если все будет сделано до коммита). По-сути, MS SQL делал примерно то же самое на своих триггерах (псевдо-таблицы inserted и deleted)- триггеров на строку то у него не было. Мне один раз доставило такую мороку!

Сегодня мне трудно сравнивать текущее состояние MS SQL и Oracle - только что вышли новые версии, в них много нового. Но, как разработчик SQL с 1988 года - уже более 15 лет, - могу сказать, что Oracle предоставляет бОльшее количество возможностей для чистых OLTP или для OLTP+хранилище систем. В последнем случае MS SQL вообще имеет архитектурные проблемы, которые он пытается покрыть, бесплатно раздавая Analyse Service.
Но - "мы истории не пишем", поэтому для конкретных проектов гораздо важнее, что разработчик знает твердо, и поэтому все преимущества Oracle могут быть снивелированы одним фактором - незнанием этих преимуществ.

Заглянул с интересом в эту ветку, ожидая найти что-нибудь полезное для себя. Но - дискуссия выродилась в спор о том, "чей язык лучше" - русский или украинский (к примеру). Утонула, так сказать в шуме.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755648
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PiНе очень понятно, что же именно ТАК.
Oracle предлагает ...Поясняю. Oracle не предоставляет стандартных системных средств для доступа к изменяемой информации в Statement Level триггерах, в отличие от MS SQL и ASA.
PiВ триггере на оператор вы можете сбросить данные в другую таблицу и по окнчанию обработки удалить их А вы предлагаете разработчику реализовать этот доступ самостоятельно, причем для каждой таблицы, где такой доступ требуется.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755655
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSЕще удобно KEY JOIN-ами с системных таблиц информацию получать, вот уж где вообще замечательно вместе с ними смотрится аггрегатная функция LIST:
Не очень вижу связь двух тем. Агрегатная функция вроде как должна работать независимо от синтаксиса соединения таблиц :)

Вообще - я вполне согласен отнести эту фичу в разряд комфортабельностей. Можно дальше не убеждать :)

P.S. На всякий случай - такую агрегацию можно сделать и в Оракле :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755767
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Думаю не стоит развивать спор на тему ЕК vs ИК. Даже на форуме MSSQL он стал напоминать лестницу. Могу сказать только одно - в моих базах данных первичные ключи не изменяются и никаких проблем в связи с этим я ни разу не наблюдал.

Дело не в споре, а в том, что раз до сих пор споры возникают, существуют недостатки и достоинства того и иного, то ограничения моделирование БД из-за особенностей реализации СУБД, не лучшее из лучшего.
Cуррогатный ключ имеет мало поводов для изменений, но явно реляционная модель не предполагает отсутствия доступа к такому ключу. Если Вы захотите явно запретить изменение этого поля в БД (чтобы повысить неизменяемость) с помощью триггера, что Вы выбирите: псевдозаписи NEW и OLD или опять inserted, updated?

ASCRUS
Есть такое понятие - каскадные триггеры.


Кстати, есть такое понятие каскадное обновление. И вплоть до отмены этого понятия желательно иметь возможность реализовать его как можно проще. Каскадное обновление прописано в разных CASE средствах.
В общем случае разработчику может быть просто дано задание его реализовать, например, руководителем. Причем никаких споров может не допускаться. А Вы говорите концепция отрицает.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755778
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo ASCRUS
Думаю не стоит развивать спор на тему ЕК vs ИК. Даже на форуме MSSQL он стал напоминать лестницу. Могу сказать только одно - в моих базах данных первичные ключи не изменяются и никаких проблем в связи с этим я ни разу не наблюдал.

Дело не в споре, а в том, что раз до сих пор споры возникают, существуют недостатки и достоинства того и иного, то ограничения моделирование БД из-за особенностей реализации СУБД, не лучшее из лучшего.
Cуррогатный ключ имеет мало поводов для изменений, но явно реляционная модель не предполагает отсутствия доступа к такому ключу. Если Вы захотите явно запретить изменение этого поля в БД (чтобы повысить неизменяемость) с помощью триггера, что Вы выбирите: псевдозаписи NEW и OLD или опять inserted, updated?

ASCRUS
Есть такое понятие - каскадные триггеры.


Кстати, есть такое понятие каскадное обновление. И вплоть до отмены этого понятия желательно иметь возможность реализовать его как можно проще. Каскадное обновление прописано в разных CASE средствах.
В общем случае разработчику может быть просто дано задание его реализовать, например, руководителем. Причем никаких споров может не допускаться. А Вы говорите концепция отрицает.
В ASA у меня есть и NEW с OLD, и Inserted с Deleted, и BEFORE с AFTER, и каскадные обновления/удаления и много много чего еще. Так что лично я могу на все Ваши вопросы ответить только одной фразой:
При разработке того или иного решения я постараюсь выбрать здравый смысл и руководствоваться текущими возможностями СУБД :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32755829
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
В ASA у меня есть и NEW с OLD, и Inserted с Deleted, и BEFORE с AFTER, и каскадные обновления/удаления и много много чего еще. Так что лично я могу на все Ваши вопросы ответить только одной фразой:
При разработке того или иного решения я постараюсь выбрать здравый смысл и руководствоваться текущими возможностями СУБД :)

Так вопросы то я задавал с целью уточнения преимуществ и недостатков. То что у Вас есть все эти возможности, то это хорошо. И мне тоже придется руководствоваться текущими возможностями. Хотя мне всегда еще чего-то хочется в плане возможностей. Оракл довольно быстро меняет версии. Народ еще на 9 не пресел с 8, а кое-кто и с 7, а уже 10 есть, но сырая. У нас на фирме поддерживаются 8 и 9, но у меня уже на 8 ломает после 9.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32756051
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это хорошо, что ASA и Oracle дадут вставить несколько нуллов в уникальный индекс... А то я уж было начал терять веру в человеков, когда увидел, что MS SQL - не дает. Странная какая-то у них логика, понять бы ее...

softwarerP.S. Как Вы вероятно знаете, Oracle экономит место и не хранит в индексах null-овские значения.
Я опять начинаю терять веру в человеков. С какой стати оракл решил чего то там мне наэкономить? Кто его об этом просил? А если мне понадобится использовать условие Is Null на индексированное уникальное необязательное поле, что, индексом уже никак не получится воспользоваться?
В аксесе, например, включение/невключение Null'ов в индекс - задается в св-вах индекса. Что в общем-то и логично.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32756078
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох Позорный
Я опять начинаю терять веру в человеков. С какой стати оракл решил чего то там мне наэкономить? Кто его об этом просил? А если мне понадобится использовать условие Is Null на индексированное уникальное необязательное поле, что, индексом уже никак не получится воспользоваться?
В аксесе, например, включение/невключение Null'ов в индекс - задается в св-вах индекса. Что в общем-то и логично.
Не надо терять веру в человечество. В приведенном ниже примере ASA поле VarName обьявленно как NULL, на него сделан уникальный индекс :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32756154
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Офф

Все чаще ловлю себя на мысли, что благодаря усилиям ASCRUS'а мне все больше хочется изучить Sybase ASA (и ASE, и PowerBuilder в придачу)
З.Ы. Заголовок у окошка хороший. Zarplata (DBA) on Zarplata. Вот так и живем - зарплата на зарплате.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32756267
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗ.Ы. Заголовок у окошка хороший. Zarplata (DBA) on Zarplata. Вот так и живем - зарплата на зарплате.
Гы - БД Zarplata на сервере Zarplata. У ASA в одноранговой сети не нужно знать имя машины или IP адрес. Говоришь имя сервера, которое ему присвоено в параметрах запуска его сервиса и ни о чем не думаешь. Очень удобно так сервер с машины на машину переносить, никто с клиентов даже и не заметит :)

авторВсе чаще ловлю себя на мысли, что благодаря усилиям ASCRUS'а мне все больше хочется изучить Sybase ASA (и ASE, и PowerBuilder в придачу)
Вот насчет ASE не знаю конечно, сильно она мне неуклюжей по функциональности кажется (не в обиду будь ей сказано), а вот Вам, работающему на связке Access + MSSQL перейти на связку ASA + PowerBuilder что раз плюнуть - ASA легче MSSQL в плане изучения, так как у ней архитектура другая, меньше граблей и больше возможностей (естественно мое личное мнение), а PowerBuilder - так это вообще просто можно представить себе Access у которого например формы данных и отчеты хранятся в виде XML описания, которое легко изменять в рунтайме (включая контролсы на нем) через специальный интрепретирующий язык , навешивать на свойства контролсов и бандов выражения, поддерживается в полной мере ООП для создания повторно наследуемых компонентов и форм, в самом языке можно использовать встроенный SQL и весь доступ к БД сделан прозрачно, где при подключении сессии достаточно указать протокол работы (ADO, ODBC, OLEDB, JDBC и т.д.), а в самой программе коду все равно, какой там протокол сейчас установлен. Как все это представите в Access - как раз и получите PowerBuilder (PowerScript кстати этакая смешная помесь VB и Smalltalk).

Так что если время свободное есть - welcome, скачать, посмотреть и обьяснения на наших форумах получить недолго хотя бы для собственного самообразования и расширения кругозора, не всеж в одной MS коллее сидеть :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32757120
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL99 PiНе очень понятно, что же именно ТАК.
Oracle предлагает ...Поясняю. Oracle не предоставляет стандартных системных средств для доступа к изменяемой информации в Statement Level триггерах, в отличие от MS SQL и ASA.
PiВ триггере на оператор вы можете сбросить данные в другую таблицу и по окнчанию обработки удалить их А вы предлагаете разработчику реализовать этот доступ самостоятельно, причем для каждой таблицы, где такой доступ требуется.
to PL99

Вы как бы правы. Но для сторонних я ситуацию поясню.

Oracle не предоставляет стандартных системных средств для доступа к изменяемой информации в Statement Level триггерах поскольку в Oracle есть триггер Row Level - и там все делается на раз.

MS SQL предоставляет стандартное системное средство для доступа к изменяемой информации в Statement Level, ибо других триггеров у него нет . И, как бы это не звучало для неприятно для некоторых, в общем случае здесь можно заработать геморрой (например, когда надо будет сделать что-либо серьезное, особенно в чужом приложении). Простите за откровенность, но именно такой случай у меня случился, еще в 2000 году. Нужно было всего-то дописать аудит ...

То, что разработчик может сделать в Oracle на Statement Level имеет лишь одно маленькое отличие - таблицу надо создать самому и записи туда сбросить самому. Я считаю это отличие маленьким, поскольку создать таблицу типа ТаЖеСамаяТаблица _Лог + оператор Insert в теле триггера - это детская забава по сравнению с написанием бизнес-кода + его отладкой + его тестированием + его сдачей + его переопределением + его перепиской +...+...

Безусловно, это сугубо личное мнение. В конечном счете кому-то и Oracle sequence кажется умопомрачительно более трудоемким, чем identity в MS SQL ;)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32757349
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pi считаю это отличие маленьким, поскольку создать таблицу типа ТаЖеСамаяТаблица_Лог + оператор Insert в теле триггера - это детская забава по сравнению с написанием бизнес-кода + его отладкой + его тестированием + его сдачей + его переопределением + его перепиской +...+...
Ну тогда можно сказать что и между Ораклом и МС СКЛ различий почти нет :)

А вообще чем кидаться красивыми умными словами давайте посмотрим как триггеры будут выглядеть на разных СУБД.

Вот например триггер на удаления дерева c подветками для MS SQL (предполагается что стоит рекурсивный вызов триггеров)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table tree(id int identity, parent int null, caption varchar( 55 ))

go

create trigger ttt om tree for delete as
begin
if not exists(select * from deleted) return
delete t
  from tree t, deleted d
  where d.id=t.parent
end
Может еще кто напишет примеры для других СУБД, для других задач? Главное чтоб были короткие и понятные.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32757413
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На ASA для деревьев код не потребуется. Просто делается FOREIGN KEY Parent_id->id с опциями CHECK ON COMMIT и CASCADE DELETE. Для различной обработки деревьев можно пользоваться рекурсивными запросами "WITH RECURSIVE" (синтаксис аналогичный DB2).
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32757531
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ээээ...
дык ведь в MS SQL тоже можно сделать On Delete Cascade?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32757578
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно можно :) Вот только насчет "CHECK ON COMMIT" (отложенная проверка до COMMIT) по моему там туго. А опция эта иногда здорово помогает, когда ссылочная целостность может быть достигнута не во время выполнения каждого оператора DML, а по окончании транзакции, что в принципе впервую очередь к деревьям и относиться.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32757609
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая разница можно или нет? Пример же просто как работать в триггере с записями той же таблицы.
Ведь далеко не всё можно сделать через FOREIGN KEY
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32758148
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Для различной обработки деревьев можно пользоваться рекурсивными запросами "WITH RECURSIVE" (синтаксис аналогичный DB2).

В Оракле тоже есть иерархические запросы. Например, чтобы удалить узел id = 1 со всеми потомками из примера, который привел SergSuper можно выполнить DML:

DELETE FROM Tree
WHERE id IN (SELECT id FROM tree
START WITH id = 1
CONNECT BY PRIOR id = parent)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32758184
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper
Может еще кто напишет примеры для других СУБД

Оракл не рекомендует рекурсий в триггерах, т.е. на DML delete, чтобы и в триггере DML delete для той же таблы по причине резкого расхода памяти.

Конечно, можно, например, такое написать:

create or replace trigger ttt
AFTER DELETE
ON tree
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
DELETE FROM tree WHERE parent = :OLD.id;
COMMIT;
END;

Но недостатком будет, наприер, то, что в случае отката операции:
delete from tree where id = 1
все потомки id = 1 будут удалены, а сам этот узел останется. Это не подойдет для ограничений целостности.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32758912
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНо недостатком будет, наприер, то, что в случае отката операции:
delete from tree where id = 1
все потомки id = 1 будут удалены, а сам этот узел останется. Это не подойдет для ограничений целостности.
Отсюда поподробнее пожалуйста. Получаются, что изменения внутри триггера не попадают в проводимую транзакцию и коммитяться отдельно ? Я так понимаю это из за обьявленной "PRAGMA AUTONOMOUS_TRANSACTION" ? А чем Вы руководствовались, обьявляя отдельную транзакцию в триггере, почему нельзя изменения внутри него провести в пределах основной транзакции ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32759003
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох ПозорныйЯ опять начинаю терять веру в человеков. С какой стати оракл решил чего то там мне наэкономить? Кто его об этом просил?
Затрудняюсь ответить - меня при этом не присутствовало.

Лох ПозорныйА если мне понадобится использовать условие Is Null на индексированное уникальное необязательное поле, что, индексом уже никак не получится воспользоваться?
Вообще-то получится. Другой вопрос, что не припомню, чтобы мне это требовалось.

Лох ПозорныйВ аксесе, например, включение/невключение Null'ов в индекс - задается в св-вах индекса. Что в общем-то и логично.
Безусловно, с точки зрения продвинутого специалиста, чем больше настроек - тем лучше. Но, честно говоря, в общем случае "оракл с мелкими недостатками" я предпочту "акцессу с мелкими преимуществами" :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32759028
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo
В Оракле тоже есть иерархические запросы. Например, чтобы удалить узел id = 1 со всеми потомками из примера, который привел SergSuper можно выполнить DML
Возможно, туда нужно еще добавить что-то типа order by level desc - иначе если constraint не deferred, будет ошибка удаления родительской записи.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32759694
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSОтсюда поподробнее пожалуйста. Получаются, что изменения внутри триггера не попадают в проводимую транзакцию и коммитяться отдельно ? Я так понимаю это из за обьявленной "PRAGMA AUTONOMOUS_TRANSACTION" ? А чем Вы руководствовались, обьявляя отдельную транзакцию в триггере, почему нельзя изменения внутри него провести в пределах основной транзакции ?

А потомучто в ORACLE нельзя в тригерх for Each Row обращаться к той же таблице, которая вызвала тригер в рамках той же транзакции.

PS: Автономные транзакции это такй костыль, при помощи которого Оракул решает проблемы кривизны собственного ядра, растущие ещё из глубины веков. Делать автономные транзакции в тригерах дурдом. Это нужно только в некоторых особых случаях, да и то разработчик должен понимать что к зачем ему это надо. А может и не надо.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32759997
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protectorА потомучто в ORACLE нельзя в тригерх for Each Row обращаться к той же таблице, которая вызвала тригер в рамках той же транзакции.

PS: Автономные транзакции это такй костыль, при помощи которого Оракул решает проблемы кривизны собственного ядра
В данном случае, похоже, Вы говорите по принципу "слышал звон".
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32760103
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper Pi считаю это отличие маленьким, поскольку создать таблицу типа ТаЖеСамаяТаблица_Лог + оператор Insert в теле триггера - это детская забава по сравнению с написанием бизнес-кода + его отладкой + его тестированием + его сдачей + его переопределением + его перепиской +...+...
Ну тогда можно сказать что и между Ораклом и МС СКЛ различий почти нет :)

А вообще чем кидаться красивыми умными словами давайте посмотрим как триггеры будут выглядеть на разных СУБД.

Вот например триггер на удаления дерева c подветками для MS SQL (предполагается что стоит рекурсивный вызов триггеров)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table tree(id int identity, parent int null, caption varchar( 55 ))

go

create trigger ttt om tree for delete as
begin
if not exists(select * from deleted) return
delete t
  from tree t, deleted d
  where d.id=t.parent
end
Может еще кто напишет примеры для других СУБД, для других задач? Главное чтоб были короткие и понятные.

Начну с Oracle. Дабы не смущать публику и себя исходными данными, я взял пример, поставляемый вместе с MS SQL Server 2000, точнее - это "Microsoft Analysis Services Samples", foodmart 2000.mdb.

Оттуда выбрана таблица "employee", как имеющая подходящие свойства:
PiSELECT LEVEL, T.* FROM "employee" T
CONNECT BY PRIOR EMPLOYEE_ID=SUPERVISOR_ID
START WITH EMPLOYEE_ID = 1

MaxLevel Q-ty of rows
---------- ------------
7 1155

за 1,623 сек. я узнал, что в таблице 1155 записей максимально 7-го уровня подчинения (начальный - 1).

Далее отрабатываю скрипт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DROP TABLE "EMP_LOG";
DROP TABLE "EMP";
CREATE TABLE EMP AS SELECT * FROM "employee";
CREATE TABLE "EMP_LOG" AS SELECT * FROM EMP  WHERE  0 = 1 ;
CREATE OR REPLACE TRIGGER EMP_BEFORE_TR AFTER DELETE ON EMP FOR EACH ROW
BEGIN
  INSERT INTO EMP_LOG ("EMPLOYEE_ID") VALUES (:OLD.EMPLOYEE_ID); END;
/
CREATE OR REPLACE TRIGGER EMP_HIERA_TR AFTER DELETE ON EMP
BEGIN
  INSERT INTO EMP_LOG (EMPLOYEE_ID)    SELECT T.EMPLOYEE_ID FROM EMP T     CONNECT BY PRIOR EMPLOYEE_ID=SUPERVISOR_ID
     START WITH EMPLOYEE_ID IN (SELECT EMPLOYEE_ID FROM EMP_LOG);
  DELETE FROM EMP_LOG; END; 
/
Да, не так красиво, как у SergSuper!
Имеем два триггера вместо одного, и еще создали доп. таблицу! Может, можно и лучше - ведь я так делал еще в 1998 году на 7-й версии Oracle, - ну, да что уж поделать, уж как пришло в голову.

Запускаем удаление:
Pidelete from emp t where EMPLOYEE_ID = 1
и - через 0,03 сек. все записи из таблицы emp удалены (поскольку я задал Самого Большого БОССА).

Ну, а теперь - к дружищу MS SQL.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DROP TABLE emp;
GO
SELECT * INTO emp FROM employee;
GO
CREATE TRIGGER emp_hiera_tr om emp FOR DELETE AS BEGIN
IF NOT EXISTS(SELECT * FROM deleted)RETURN
DELETE EMP 
  FROM emp T, deleted D
  WHERE T.employee_id = D.supervisor_id
END
GO
exec sp_dboption 'Orcl64','recursive triggers','true'
GO 
Собственно, код взят у SergSuper.

Пробуем - и неудача!
MS SQLServer: Msg 170, Level 15, State 1, Procedure emp_hiera_tr, Line 1
Line 1: Incorrect syntax near 'om'.
Смотрим... ага! меняем
CREATE TRIGGER emp_hiera_tr om emp FOR DELETE AS BEGIN на
CREATE TRIGGER emp_hiera_tr ON emp FOR DELETE AS BEGIN

Теперь вроде вусе путем!
Запускаем:
Код: plaintext
delete from emp where EMPLOYEE_ID =  1 ;
MS SQL(1 row(s) affected)
В самом деле? Одну запись? Проверяем... Да, так и есть! Удалена только одна запись. тогда меняем триггер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DROP TRIGGER emp_hiera_tr 
GO
CREATE TRIGGER emp_hiera_tr ON emp FOR DELETE AS BEGIN
DELETE EMP 
  FROM emp T, deleted D
  WHERE T.employee_id = D.supervisor_id
END
GO
И - запускаем команду
[SRC]delete from emp where EMPLOYEE_ID = 1;[src] MS SQLServer Msg 217, Level 16, State 1, Procedure emp_hiera_tr, Line 2
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).

Вот тебе, бабушка, и Юрьев день!

Лезем в документацию:
MS SQLServer Using Nested Triggers
...Triggers can be nested up to 32 levels...


Да, так и должно было быть!

Ну, господа эксперты еще выскажутся,
а я подведу первичные итоги:


1. Приведенный пример в Oracle выглядит сложнее. Правда, я лично его написал не думая, по памяти, а MS SQL взял готовый - но это уже издержки образования.

2. Пример в Oracle работает очень быстро. Скажем, удаление из аналогичной таблицы (БЕЗ триггера!) командой delete from emp1 дает... те же 0,3 сек.

3. Пример в MS SQL, ВООБЩЕ ГОВОРЯ, НЕ РАБОТОСПОСОБЕН. Этот тот самый геморрой, о котором я имел место говорить.

4. Попутно желающие могут увидеть, что Oracle поддерживает очень интересную форму запроса - иерархическую:
Piselect max(level) "MaxLevel", count(*) "Q-ty of rows" from "employee" t
connect by prior EMPLOYEE_ID=SUPERVISOR_ID start with EMPLOYEE_ID = 1;
благодаря которой можно не только построить дерево (как подчиненных, так и боссов), но и узнать уровень иерархии. Подчеркну, что этот пример взят мною из Oracle 7.3 - уже там это все работало. Может, работало и раньше, но раньше я просто не работал :)

Поэтому прошу господ, ратующих за простоту (особенно гг. "аксесников"), вспоминать время от времени старую русскую поговорку -
Простота хуже воровства

Заранее благодарен всем за все конструктивные замечания и пожелания по форме и содержанию поста!
Засим - всего доброго!
Pi
P.S.
Примеры проверялись на
Athlon (Barton) 2500+, 1 Gb ОЗУ PC-2700, Windows 2003 EE (Windows NT 5.2 3790), MS SQL 2000 EE (8.00.760 (SP3)), Oracle 8.1.7.1.4
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32760113
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protector ASCRUSОтсюда поподробнее пожалуйста. Получаются, что изменения внутри триггера не попадают в проводимую транзакцию и коммитяться отдельно ? Я так понимаю это из за обьявленной "PRAGMA AUTONOMOUS_TRANSACTION" ? А чем Вы руководствовались, обьявляя отдельную транзакцию в триггере, почему нельзя изменения внутри него провести в пределах основной транзакции ?

А потомучто в ORACLE нельзя в тригерх for Each Row обращаться к той же таблице, которая вызвала тригер в рамках той же транзакции.

PS: Автономные транзакции это такй костыль, при помощи которого Оракул решает проблемы кривизны собственного ядра, растущие ещё из глубины веков. Делать автономные транзакции в тригерах дурдом. Это нужно только в некоторых особых случаях, да и то разработчик должен понимать что к зачем ему это надо. А может и не надо.

Примерно так думали индейцы, глядя на мушкеты европейцев. Им, индейцам, европейские мушкеты казались костылями, на которые хиляки бледнолицые опирали свои собственные кривые ядр.. тьфу, тела. Им, индейцам, эти костыли вообще не нужны были! ;)

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

На самом деле автономные транзакции - это просто другая парадигма, которую не все способны сразу оценить. Вот в Советском Союзе одна из крупнейших коммерческих систем была система Экспресс, которая продавала билеты. Так вот, из-за советской мировозрения эта система могла с точностью до 1 ответить на вопрос - сколько билетов продала Московская ж.д. за такой-то день. Но она никогда бы не смогла ничего вразумительного сказать - а сколько билетов она НЕ продала, сколько пассажиров остались за этот же неудовлетворенными. И добавление такой возможности было одним из первых в списке требований к созданию Экспресс-УЗ. Что же раньше не надо было? ДА! Раньше было не надо, поскольку это было советское хозяйство ...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32760130
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS авторНо недостатком будет, наприер, то, что в случае отката операции:
delete from tree where id = 1
все потомки id = 1 будут удалены, а сам этот узел останется. Это не подойдет для ограничений целостности.
Отсюда поподробнее пожалуйста. Получаются, что изменения внутри триггера не попадают в проводимую транзакцию и коммитяться отдельно ? Я так понимаю это из за обьявленной "PRAGMA AUTONOMOUS_TRANSACTION" ? А чем Вы руководствовались, обьявляя отдельную транзакцию в триггере, почему нельзя изменения внутри него провести в пределах основной транзакции ?

Дело в том, г. ASCRUS, что разработчики Oracle, создавая свою базу еще в те времена, когда ВСЯ компьютерная мощь Соединенных Штатов была сравнима с десятком современных персоналок, обращали внимание в первую очередь на быстродействие. И они заметили, что транзакции можно разделить на "длинные" и "короткие". И если точно знать, что транзакция будет "короткой", то можно кое-что съэкономить. И прямо дали такую возможность разработчикам:
Application developers can improve the performance of short, nondistributed transactions by using the BEGIN_DISCRETE_TRANSACTION procedure
Поколебавшись (а может, и без колебаний) этот же механизм был использован для триггеров Row Level . Собственно, это решение и повлекло некоторые ограничения. почему в данном случае разработчики выбрали между вседозволенностью и скоростью второе - понятно (см. выше)

Возможно, сегодня и можно было бы изменить, да на свет уже появился MS SQL, который опытными разработчиками Digital ведется как раз в сторону вседозволенности - так зачем? кому надо, тот MS SQL купит...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32760145
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Отсюда поподробнее пожалуйста. Получаются, что изменения внутри триггера не попадают в проводимую транзакцию и коммитяться отдельно ? Я так понимаю это из за обьявленной "PRAGMA AUTONOMOUS_TRANSACTION" ? А чем Вы руководствовались, обьявляя отдельную транзакцию в триггере, почему нельзя изменения внутри него провести в пределах основной транзакции ?

Не только внутри триггера. Автономные транзакции позволяют изолировать DML-инструкции выполняемые в анонимном блоке, процедуре, функции, триггере, пакетной процедуре и пакетной функции от контекста транзакции вызывающего кода. Этот блок определяется как независимая транзакция, начатая другой транзакцией, которая является главной. Т.е. эти транзакции выполняют фиксацию или откат самомстоятельно. В моем примере прописана фиксация. Главная может откатить, а автономные уже зафиксировали результат.
Да, объявляется с помощью "PRAGMA AUTONOMOUS_TRANSACTION".
Руководствуюсь тем, что триггер на уровне записи, объявленный как автономная транзакция может читать из таблы, а обычный нет. Потому что в результате такого чтения могут получаться разные результаты при выполнении одной и той же DML и результат работы триггера может оказаться разным в зависимости, например, от порядка строк, который будет возвращен.
Но это просто пример. В общем случае он не подходит. Например, для реализации каскадного удаления для деревьев, поскольку должно быть удалено все или ничего.
Продолжаю считать, что рекурсия в триггерах не лучшее из лучшего. (Вообще рекурсия наверное хорошо для деуларативных языков, но не для процедурных IXMO). Хоть автономная транзакция хоть нет. И Оракл этого строго не рекомендует, равно как писать триггера по любому поводу. Тем более все что можно решить декларативно, должно быть решено декларативно.
Хотя другая правда в том, что тот же Оракл в случае применения Мультимастер репликации рекомендует декларативное каскадное удаление заменить соответствующим триггером.
Надеюсь, что в следующих версиях будет лучше.
Автономные транзакций позволяет в Оракле, например:
реализовывать протоколы об ошибках, хотя главная транзакция и откатится, счетчики неудачных попыток, фиксацию и откат в триггерах БД.
Про другие СУБД не знаю. Но интересуюсь.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32760177
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В приведенном мною выше коде есть существенная ошибка - триггер EMP_HIERA_TR был приведен не полностью. Полная версия такова:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE OR REPLACE TRIGGER EMP_HIERA_TR 
AFTER DELETE ON EMP
BEGIN

  INSERT INTO EMP_LOG (EMPLOYEE_ID)    
    SELECT T.EMPLOYEE_ID FROM EMP T     
      CONNECT BY PRIOR EMPLOYEE_ID=SUPERVISOR_ID
      START WITH EMPLOYEE_ID IN (SELECT EMPLOYEE_ID FROM EMP_LOG);

    DELETE FROM EMP
      WHERE EMPLOYEE_ID IN (SELECT EMPLOYEE_ID FROM EMP_LOG) ; 

    DELETE FROM EMP_LOG; 
  END; 
/

Кроме того, в Oracle рекурсия тоже вызывает затык . Т.е. приведенный мною пример ВООБЩЕ ГОВОРЯ не работоспособен .

Уровень рекурсии для ORacle 8.1.7.4 - 50 вложенных вызовов.

Извините за ошибки!
Pi
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32760321
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну раз пошла такая пьянка, приведу и я для ASA триггер (хотя и на CASCADE DELETE все прекрасно работает).

Для начала отключим каскад:
Код: plaintext
1.
2.
ALTER TABLE "DBA"."ProductGroup" 
  ADD FOREIGN KEY "ProductGroup" ( "Parent_id" ) 
    REFERENCES "DBA"."ProductGroup" ( "ProductGroup_id" ) CHECK ON COMMIT;
Если бы здесь не стоял CHECK ON COMMIT, до AFTER триггера дело бы и не дошло и при удалении родительских нод мы бы получили ошибку. А так все ok - только на COMMIT ASA проверит ссылочную целостность, так что во время транзакции делаем с деревом что хотим.

Теперь приведенный пример под MSSQL прекрасно отработает, так как никаких ограничений на уровень вложенностей вызовов в ASA нет - все ограничивается только доступнами ресурсами. Однако пример с точки зрения ASA неуклюжий, поэтому напишем свой триггер, без всяких рекурсий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
CREATE TRIGGER ProductGroup_DeleteChild AFTER DELETE
ORDER  1  ON ProductGroup
REFERENCING OLD AS ParentsDeleted
FOR EACH STATEMENT
WHEN (
  // Отрубаем рекурсию
  VarExists('_IsCascadeDeny') =  0 
)
BEGIN
  // Обьявляем быструю времянку для удаляемых нодов
  DECLARE LOCAL TEMPORARY TABLE Nodes (
    ProductGroup_id varchar( 8 ) NOT NULL PRIMARY KEY
  ) NOT TRANSACTIONAL;

  // Обьявляем глобальную переменную, отрубающую рекурсию
  CREATE VARIABLE _IsCascadeDeny bit;

  // Получаем дочерние ноды через рекурсивный запрос
  INSERT INTO Nodes
    WITH RECURSIVE h (Parent_id, Node_id) AS (
      SELECT Parent_id, ProductGroup_id
      FROM ProductGroup
      WHERE Parent_id IN (
              SELECT ProductGroup_id
              FROM ParentsDeleted )
      UNION ALL
      SELECT g.Parent_id, g.ProductGroup_id
      FROM ProductGroup g
        INNER JOIN h ON h.Node_id = g.Parent_id )
    SELECT Node_id
    FROM h;

  // Удаляем дочерние ноды
  DELETE FROM ProductGroup
  WHERE ProductGroup_id IN (
    SELECT ProductGroup_id
    FROM Nodes );

  // Удаляем глобальную переменную
  DROP VARIABLE _IsCascadeDeny;

// Обработка ошибок в теле триггера
EXCEPTION
  WHEN OTHERS THEN
    // Удаляем глобальную переменную
    DROP VARIABLE _IsCascadeDeny;

    // Поднимаем обратно ошибку
    RESIGNAL;
END;
Что мы с него видим:
1. Он сделан как FOR EACH STATEMENT и будет вызываться только один раз для всего множества удаляемых нодов с дерева.
2. В ASA поддерживаются глобальные сессионные переменные
3. В ASA нет опций запрета вызова рекурсий, все это можно разрулить через глобальные переменные
4. В ASA есть времянки, которые не участвуют в транзакциях, что соотвествующе прибавляем им скорости работы.
5. В ASA есть рекурсивные запросы, которые можно применять в SELECT и INSERT, но не в DELETE. Соотвествующе поэтому и была создана времянка.
6. В ASA есть понятие исключений для блоков BEGIN..END и соотвествующая обработка их.

В итоге при
Код: plaintext
1.
DELETE FROM ProductGroup
WHERE ProductGroup_id IN ('Прод', 'Тех');
будет один раз вызван написанный выше триггер, который удалит все нужные дочерние ноды. Однако SELECT @@ROWCOUNT возвратит 2 записи, так как в ASA эта системные глобальные переменные имеют свою область видимости (что особенно приятно для @@IDENTITY).

В дополнение - мне лично WITH RECURSIVE, использующийся для обработки деревьев в ASA и DB2 нравиться больше, чем Ораклевый вариант. Вместо обьяснений приведу пример почему:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH RECURSIVE h (Parent_id, Node_id, Level, Path) AS (
  SELECT Parent_id, ProductGroup_id,  0 , ProductGroup_id
  FROM ProductGroup
  WHERE Parent_id IS NULL
  UNION ALL
  SELECT g.Parent_id, g.ProductGroup_id, h.Level +  1 , h.Path || '/' || g.ProductGroup_id
  FROM ProductGroup g
    INNER JOIN h ON h.Node_id = g.Parent_id )
SELECT Replicate('-', Level *  4 ) || Name AS Name, h.*
FROM h
  INNER JOIN ProductGroup pg ON pg.ProductGroup_id = h.Node_id
ORDER BY Path;
А это результат:
NameParent_idNode_idLevelPath'Продукты питания''Прод'0'Прод''----Молочные продукты''Прод''Молоч'1'Прод/Молоч''----Хлебобулочные изделия''Прод''Хлеб'1'Прод/Хлеб''Техника''Тех'0'Тех''----Бытовая техника''Тех''БытТех'1'Тех/БытТех''----Видеоэлектронника''Тех''ВидеоТех'1'Тех/ВидеоТех''--------Видеомагнитофоны''ВидеоТех''ВМ'2'Тех/ВидеоТех/ВМ''--------Телевизоры''ВидеоТех''ТВ'2'Тех/ВидеоТех/ТВ'
Из за того, что в рекурсивном запросе можно отдельно указать запрос, откуда брать родителей и запрос, откуда брать детей, можно:
1. Строить рекурсивные запросы по деревьям, хранящимся во множестве таблиц
2. Организовывать нарастающие переменные, в данном случае были организованы переменные Level (уровень вложености нода), которая использовалась для отступа в наименовании группы и Path (путь к ноду), по которой была произведена сортировка нодов относительно каждого родительского нода.
Насколько я понимаю, чтобы все это проделать в Оракле одним чистым запросом отделаться нельзя будет.

P.S. Красивее было бы конечно в наименовании отступы ставить пробелами, но у Judge тэг CSV их кушает дюже хорошо :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32760580
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote Pi]Примерно так думали индейцы, глядя на мушкеты европейцев. Им,
индейцам, европейские мушкеты казались костылями, на которые хиляки
бледнолицые опирали свои собственные кривые ядр.. тьфу, тела. Им, индейцам,
эти костыли вообще не нужны были! ;)[/quote]
Очень красочный пример :) Только они зачастую и вправду не нужны. Во многих
серверах нет автономных транзакций и люди прекрасно без этого обходятся.

[quote Pi]Приведу такой простой пример из некоторых особых случаях - Вы
хотите, чтобы логгировались все изменения в базе, в том числе те, которые
были незафиксированы. Т.е., транзакция откатилась, а в логе все, что Вы
пожели, осталось. Автономные транзакции это решают очень просто.[/quote]
Да спору нет. Решают они это очень просто. Но опять-же повторюсь, что в
других серверах это тоже решается, по другому, иногда не так просто, но
решается. Вы лучше про минусы автономных транзакций раскажите, про плюсы
своего любимого сервера все горазды говорить, про минусы обычно же
умалчивают.

[quote Pi]На самом деле автономные транзакции - это просто другая парадигма,
которую не все способны сразу оценить.[/quote]
Видать не судьба. Ну не могу я её оценить и всё тут. Она прямо нарушает ACID
вот и всё, что тут ещё скажешь.
[quote Pi]Вот в Советском Союзе одна из крупнейших коммерческих систем была
система Экспресс, которая продавала билеты. Так вот, из-за советской
мировозрения эта система могла с точностью до 1 ответить на вопрос - сколько
билетов продала Московская ж.д. за такой-то день. Но она никогда бы не
смогла ничего вразумительного сказать - а сколько билетов она НЕ продала,
сколько пассажиров остались за этот же неудовлетворенными. И добавление
такой возможности было одним из первых в списке требований к созданию
Экспресс-УЗ. Что же раньше не надо было? ДА! Раньше было не надо, поскольку
это было советское хозяйство ...[/quote]
И к чему бы это?

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32760587
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote softwarer][quote protector]
А потомучто в ORACLE нельзя в тригерх for Each Row обращаться к той же таблице, которая вызвала тригер в рамках той же транзакции.

PS: Автономные транзакции это такй костыль, при помощи которого Оракул решает проблемы кривизны собственного ядра

В данном случае, похоже, Вы говорите по принципу "слышал звон".[quote]
Это какой же такой звон я слышу? Может укажете мне сирому... Не дадите умереть в неведение...

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32760653
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote ASCRUS][/quote]
Здорово. Всё больше убеждаюсь, что в АSA самый лучший SQL на сегодняшний день. Оракулу не чета.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32760873
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protector
Во многих
серверах нет автономных транзакций и люди прекрасно без этого обходятся.

Так люди прекрасно обходились и без компьтеров, телевизоров и т.д. в позопрошлом веке. И вред от них тоже есть. Т.е. довод основанный на том, что люди прекрасно обходятся, не может быть безупречным во всех отношениях и нуждается в уточнених. Мы как раз здесь и пытаемся уточнять.
Мне, например, интересны все сведения, поскольку меня интересуют технолгоии БД вообще и СУБД, в частности. Хотя я Ораклист, и это не может не влиять на желание, чтобы он был лучшим, как бы я ни старался быть объективным.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32760989
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSНу раз пошла такая пьянка, приведу и я для ASA триггер
Ну раз пошла такая пьянка, приведу и для Oracle. Правда - на скорую руку, так что проверил работоспособность, но не уверен в оптимальности.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
create table parented (
  id integer not null primary key, 
  parent_id integer constraint parent_fk references parented (id) 
    initially deferred deferrable) ;
insert into parented values ( 0 , null) ;
insert into parented select rownum, rownum -  1  from dba_objects where rownum <=  100  ;

create or replace package parented_deleting is
  id integer ;
  into_cascade boolean := false ;
end ;
/

create or replace trigger ad_parented_cascade_s
  after delete on parented
declare
  type TRecords is table of parented.id%type ;
  records TRecords ;
begin
  if parented_deleting.into_cascade then return ; end if ;
  parented_deleting.into_cascade := true ;
  select id bulk collect into records from parented 
    start with parent_id = parented_deleting.id 
    connect by prior id = parent_id
    order by level desc ;
  forall i in records.first..records.last
    delete from parented where id = records ( i ) ;
  parented_deleting.into_cascade := false ;
exception 
  when others then
    parented_deleting.into_cascade := false ;
    raise ;
end ;

create or replace trigger ad_parented_cascade_r
  after delete on parented
  for each row
begin
  parented_deleting.id := :old.id ;
end ;

delete from parented where id =  10  ;
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761021
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю автономные транзакции (как и любое функциональное расширение) конечно же нужны и нельзя говорить на любую фичу, которая отстуствует в твоей СУБД - что это плохо или не нужно. Наоборот - это хорошо, при условии, что знаешь как это готовить. В принципе те примеры с event-ами, что раньше я приводил для ASA можно назвать синонимом таких автономных транзакций - так как события запускаются в параллейной сессии, то недолго написать событие, которому передается в качестве параметра строка запроса (или целый батч), которое событие выполняет через динамический SQL, шлепая следом COMMIT. Тогда в любом триггере достаточно написать на неудачный аудит:
Код: plaintext
TRIGGER EVENT event_DoSQL (@SQL = 'INSERT INTO Table ...');
и смело откатываться, событие "event_DoSQL" в данном случае будет запущено уже автономно в параллейной сессии и никоим образом не будет зависеть от жизни транзакций в вызывавшей его сессии. Сам текст события будет такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE EVENT "event_DoSQL"
HANDLER
BEGIN 
  EXECUTE IMMEDIATE WITH RESULT SET OFF Event_Parameter('@SQL');
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    MESSAGE 'Ошибка выполнения динамического SQL:/n' || ErrorMsg() TO LOG;
    ROLLBACK;
END;
Фактически думаю очень похоже получается на Ораклевые автономные транзакции :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761033
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНу раз пошла такая пьянка, приведу и для Oracle.
Ну вот и еще один человек, который умеет правильно готовить кошек :)

Думаю на instance триггерах можно и для MSSQL нормальное решение накатать без ограничений, так что пока мы в очередной раз пришли только к одному выводу - все можно реализовать на всем. Зависит это только от наших познаний и время разработки реализации поставленной задачи обратно пропорционально наличию подходящего штатного функционала в СУБД.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761041
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo... Мы как раз здесь и пытаемся уточнять.
Мне, например, интересны все сведения, поскольку меня интересуют технолгоии БД вообще и СУБД, в частности. Хотя я Ораклист, и это не может не влиять на желание, чтобы он был лучшим, как бы я ни старался быть объективным.

Разделяю Вашу позицию. Сам я работал на R:base, DB2/OS2, DB2/400, Oracle, MS SQL, и не очень считаю себя субъективным, но опасность такая есть, поэтому и предлагаю здесь конкретные решения. Правда, иногда с ошибками :((

А что касается парадигм, то именно потому, что мне лично приходилось с DOS-а пересаживаться на OS/400, вязаться с базами на майнфреймах и UNIX-системах, именно поэтому я в первую очередь обращаю внимание на то, что разница в системах - это именно разные парадигмы . Впрочем, намного лучше это сказал еще Кузьма
Прутков Многие вещи нам непонятны не потому, что наши понятия слабы, а потому, что они не входят в круг наших понятий
Прутков Вещи бывают великими и малыми не токмо по воле судьбы и обстоятельств, но также по понятиям каждого
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761046
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo
protector

Во многих
серверах нет автономных транзакций и люди прекрасно без этого обходятся.


Так люди прекрасно обходились и без компьтеров, телевизоров и т.д. в позопрошлом веке. И вред от них тоже есть. Т.е. довод основанный на том, что люди прекрасно обходятся, не может быть безупречным во всех отношениях и нуждается в уточнених.
Мы как раз здесь и пытаемся уточнять.
Это то да. Есть такое мнение: "Фичи лишними не бывают". Возможно так оно и есть. Но только каждая фича, как уже здесь кто-то сказал, это динамит в руки обезьяне. При неграмотном использовании можно натворит такого что не разгребёшь. Тут надо сопоставить все плюсы и минусы. Хотя этот спор больше теоретический. Мне лично глубоко наплевать в каком сервере какие фичи есть. Что есть тем и будем пользоваться. Какая в сущности разница. Оракул Сибэйс или Информикс. Главное чтобы работало надёжно и быстро. А как это достигается мне не интересно.

vadiminfo
Мне, например, интересны все сведения, поскольку меня интересуют технолгоии БД вообще и СУБД, в частности. Хотя я Ораклист, и это не может не влиять на желание, чтобы он был лучшим, как бы я ни старался быть объективным.
Это хорошо :) Тут я полностью солидарен. Объективность это весчь. :)




Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761088
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSФактически думаю очень похоже получается на Ораклевые автономные транзакции :)
В Оракле, возможно, к этому будет ближе понятие pipe - это механизм, которым процессы могут использовать для обмена сообщениями. Процессом-приемником и исполнителем в данном случае может выступать, например, job. Разница с автономной транзакцией в том, что автономная транзакция выполняется "в том же потоке", то есть основная ждет ее завершения, беспроблемно идет передача параметров в обоих направлениях, исключения автономной транзакции могут быть обработаны в основной. А event, я так полагаю, выполняется именно что параллельно.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761141
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSНу вот и еще один человек, который умеет правильно готовить кошек :)
Меня тут поправил один уважаемый коллега - забыл упомянуть, что сэкономил несколько "технических" строк. Реально поле id нужно делать массивом, дабы правильно шли массовые удаления.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761145
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Возвращаясь к нашим баранам". Ниже приведен код, относящийся к иерархическому удалению записей таблицы триггерами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
DROP TABLE "EMP_TMP";
DROP TABLE "EMP";
CREATE TABLE EMP AS SELECT * FROM "employee";
CREATE GLOBAL TEMPORARY TABLE "EMP_TMP" AS SELECT * FROM EMP  WHERE  0 = 1 ;
CREATE OR REPLACE VIEW EMP_V AS
  SELECT EMP.* FROM EMP;
/  
CREATE OR REPLACE TRIGGER EMP_INSTEAD_TR 
INSTEAD OF DELETE ON EMP_V 
REFERENCING OLD AS OLD              -- new 
FOR EACH ROW
DECLARE
    empCount NUMBER;
BEGIN
  SELECT COUNT(*) INTO empCount 
      FROM emp e
      WHERE e.EMPLOYEE_ID = :OLD.EMPLOYEE_ID;

 IF empCount >=  1  THEN

  INSERT INTO EMP_TMP (EMPLOYEE_ID)    
    SELECT T.EMPLOYEE_ID FROM EMP T     
      CONNECT BY PRIOR EMPLOYEE_ID=SUPERVISOR_ID
        START WITH EMPLOYEE_ID = :OLD.EMPLOYEE_ID;
  
  DELETE FROM EMP
         WHERE EMPLOYEE_ID IN 
           (SELECT EMPLOYEE_ID FROM EMP_TMP);

  DELETE FROM EMP_TMP;               
 END IF;
END;
/

SQL> set timing on;
SQL> SELECT COUNT(*) FROM EMP;

COUNT(*)
----------
1155

Executed in 0,16 seconds

SQL> delete from emp_v t where EMPLOYEE_ID = 1;

1 row deleted

Executed in 1,983 seconds

SQL> SELECT COUNT(*) FROM EMP;

COUNT(*)
----------
0

Executed in 0,01 seconds
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761153
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати все примеры неплохо в FAQ по каждой СУБД ложаться - все обьяснено, проверено и опробовано. Так что глядишь по ходу всяких обсуждений еще и FAQ пополним :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761160
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь позвольте мне поставить проблему.
Запрос
Код: plaintext
1.
2.
select sum(store_sales) Sum from sales_fact_1997 t
where customer_id =  2094 
and product_id= 173 ;

возвращает неправильный результат.

Неправильность состоит в том, что в технологическое время сервер устойчиво возвращает результат 785.28, а при многопользовательской работе сумма чуть другая. К серверу поступают операторы изменения только вот такого типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin transaction
update sales_fact_1997 set 
STORE_COST= 1 . 95 ,
STORE_SALES= 4 . 68 
where ID =  1 ;
update sales_fact_1997 set 
STORE_COST= 1 . 84 ,
STORE_SALES= 4 . 29 
where ID =  28794421 ;
commit;

то есть, только операторы НЕ меняющие баланс по клиенту+товару! Стоит остановить поток изменений - и баланс "возвращается" на место.

В чем может быть причина?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761175
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще такая "простенькая" задачка:

Есть стороннее приложение, поддерживаемое разработчиком (т.е., любое изменение - потеря поддержки). В приложении есть разделение прав по отделам - каждый отдел видит только свои проводки. Но Вам неожиданно поставили задачу - ввести разграничение доступа к проводкам по их суммам! Т.е., большие сделки (больше XXXX) могут видеть только "особо уполномоченные".

Как бы Вы поступили в этом случае?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761197
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PiИ еще такая "простенькая" задачка:
Смотря что Вы называете "изменением". При некотором понимании задача неадминистративного решения не имеет :)

Подразумевающийся ответ для Oracle - FGAC, он же row level security, он же DBMS_RLS.

Универсальное, не зависящее от сервера решение - сбрасывать дешевые проводки в отдельную базу.

Хм. Ну еще можно клиента подпатчить - так, чтобы ненужные строки пропускались в датасетах, возвращаемых в клиентское приложение.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761220
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo SergSuper
Может еще кто напишет примеры для других СУБД

Оракл не рекомендует рекурсий в триггерах, т.е. на DML delete, чтобы и в триггере DML delete для той же таблы по причине резкого расхода памяти.

Конечно, можно, например, такое написать:

create or replace trigger ttt
AFTER DELETE
ON tree
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
DELETE FROM tree WHERE parent = :OLD.id;
COMMIT;
END;

Но недостатком будет, наприер, то, что в случае отката операции:
delete from tree where id = 1
все потомки id = 1 будут удалены, а сам этот узел останется. Это не подойдет для ограничений целостности.
vadiminfo,
Ваш код работает, и работает достаточно быстро - 2, 403 сек. Его "недостаток" - отсутствие возможности отката, - не очень существеннен в обсуждаемом примере, поскольку триггер-то стоит AFTER, когда уже все проверили, а возможность срабатывания триггеров на других таблицах в нашем примере не обсуждается - ведь это не из реальной жизни. В реальной жизни обсуждаемый пример решается совсем по другому
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761314
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pi Его "недостаток" - отсутствие возможности отката, - не очень существеннен в обсуждаемом примере, поскольку триггер-то стоит AFTER, когда уже все проверили, а возможность срабатывания триггеров на других таблицах в нашем примере не обсуждается - ведь это не из реальной жизни. В реальной жизни обсуждаемый пример решается совсем по другому
Не могли бы Вы пояснить, что значит не очень существеннен? В этом примере- возможно, а в некоторых задачах очень существенен. Кстати, как Вы себе представляете этот тригер [sql]BEFORE FOR EACH ROW[/sql]? А решение, т.к. настоящее "из реальной жизни" попахивает извращением. Почему я должен делать два тригера вместо одного да ещё и пихать данные в таблицу, а потом оттуда вытаскивать? Почему великий и могучий Оракул до сих пор не имеет в общем-то простой и нужной возможности?


Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761348
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protector
Почему я должен делать два тригера вместо одного да ещё и пихать данные в таблицу, а потом оттуда вытаскивать? Почему великий и могучий Оракул до сих пор не имеет в общем-то простой и нужной возможности?


Posted via ActualForum NNTP Server 1.1

Каков вопрос - таков ответ. Была поставлена задача г. SergSuper (а где он, кстати?) в его посте от 27 окт 04, 15:40 (см. эту ветку, стр. 12).

НЕ выходя за пределы задачи, было предложены решения. Например, оказалось, что приведенный самим SergSuper код валится на 32 циклах вложенности. Подобный (подчеркну - подобный ) код на Oracle валится на 50 вложениях.

Но есть обходные примеры, которые показали пока только на ASA и Oracle. Ждем подобных примеров на MS SQL! Желательно с проверкой на большом количестве данных - я указал возможную таблицу для тестирования.

А на самом деле предложенная г. SergSuper задача по-сути решается совсем по-другому - через FK on DELETE CASCADE.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761361
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer PiИ еще такая "простенькая" задачка:
Смотря что Вы называете "изменением". При некотором понимании задача неадминистративного решения не имеет :)

Подразумевающийся ответ для Oracle - FGAC, он же row level security, он же DBMS_RLS.

Универсальное, не зависящее от сервера решение - сбрасывать дешевые проводки в отдельную базу.

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

Пан softwarer,
я совершенно согласен с Вами в предложенном решении для Oracle.

А кто что предложит для других баз?

Теперь позвольте свой комментарий.
Oracle сегодня (впрочем, и вчера тоже!), в коммерческом релизе, дает возможность значительно увеличить детальность доступа к данным без изменения приложений (и без потери поддержки!). Фактически, имея на руках коммерческий Oracle, можно создавать приватные базы .
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761394
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSНу раз пошла такая пьянка, приведу и я для ASA триггер
...
Что мы с него видим:
1. Он сделан как FOR EACH STATEMENT и будет вызываться только один раз для всего множества удаляемых нодов с дерева.
2. В ASA поддерживаются глобальные сессионные переменные
3. В ASA нет опций запрета вызова рекурсий, все это можно разрулить через глобальные переменные
4. В ASA есть времянки, которые не участвуют в транзакциях, что соотвествующе прибавляем им скорости работы.
5. В ASA есть рекурсивные запросы, которые можно применять в SELECT и INSERT, но не в DELETE. Соотвествующе поэтому и была создана времянка.
6. В ASA есть понятие исключений для блоков BEGIN..END и соотвествующая обработка их.


ASCRUS,
а как Вы в Dfitv коде получили доступ к удаленным записям? В MS SQL - это записи в deleted, а в ASA?

thanks in advance!
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761451
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSНу раз пошла такая пьянка...
В дополнение - мне лично WITH RECURSIVE, использующийся для обработки деревьев в ASA и DB2 нравиться больше, чем Ораклевый вариант. Вместо обьяснений приведу пример почему:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH RECURSIVE h (Parent_id, Node_id, Level, Path) AS (
  SELECT Parent_id, ProductGroup_id,  0 , ProductGroup_id
  FROM ProductGroup
  WHERE Parent_id IS NULL
  UNION ALL
  SELECT g.Parent_id, g.ProductGroup_id, h.Level +  1 , h.Path || '/' || g.ProductGroup_id
  FROM ProductGroup g
    INNER JOIN h ON h.Node_id = g.Parent_id )
SELECT Replicate('-', Level *  4 ) || Name AS Name, h.*
FROM h
  INNER JOIN ProductGroup pg ON pg.ProductGroup_id = h.Node_id
ORDER BY Path;
А это результат:
NameParent_idNode_idLevelPath'Продукты питания''Прод'0'Прод''----Молочные продукты''Прод''Молоч'1'Прод/Молоч''----Хлебобулочные изделия''Прод''Хлеб'1'Прод/Хлеб''Техника''Тех'0'Тех''----Бытовая техника''Тех''БытТех'1'Тех/БытТех''----Видеоэлектронника''Тех''ВидеоТех'1'Тех/ВидеоТех''--------Видеомагнитофоны''ВидеоТех''ВМ'2'Тех/ВидеоТех/ВМ''--------Телевизоры''ВидеоТех''ТВ'2'Тех/ВидеоТех/ТВ'
Из за того, что в рекурсивном запросе можно отдельно указать запрос, откуда брать родителей и запрос, откуда брать детей, можно:
1. Строить рекурсивные запросы по деревьям, хранящимся во множестве таблиц
2. Организовывать нарастающие переменные, в данном случае были организованы переменные Level (уровень вложености нода), которая использовалась для отступа в наименовании группы и Path (путь к ноду), по которой была произведена сортировка нодов относительно каждого родительского нода.
Насколько я понимаю, чтобы все это проделать в Оракле одним чистым запросом отделаться нельзя будет.

P.S. Красивее было бы конечно в наименовании отступы ставить пробелами, но у Judge тэг CSV их кушает дюже хорошо :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select LPAD(' ', 2 *(LEVEL- 1 )) || ename ename, 
    empno, mgr, job,  sys_connect_by_path( ename, '/' ) path   from emp
    start with ename='KING'
    connect by prior empno = mgr;
SQL> 

ENAME                                                                            EMPNO   MGR JOB       PATH
-------------------------------------------------------------------------------- ----- ----- --------- --------------------------------------------------------------------------------
KING                                                                               7839        PRESIDENT /KING
  JONES                                                                            7566    7839  MANAGER   /KING/JONES
    SCOTT                                                                          7788    7566  ANALYST   /KING/JONES/SCOTT
      ADAMS                                                                        7876    7788  CLERK     /KING/JONES/SCOTT/ADAMS
    FORD                                                                           7902    7566  ANALYST   /KING/JONES/FORD
      SMITH                                                                        7369    7902  CLERK     /KING/JONES/FORD/SMITH
  BLAKE                                                                            7698    7839  MANAGER   /KING/BLAKE
    ALLEN                                                                          7499    7698  SALESMAN  /KING/BLAKE/ALLEN
    WARD                                                                           7521    7698  SALESMAN  /KING/BLAKE/WARD
    MARTIN                                                                         7654    7698  SALESMAN  /KING/BLAKE/MARTIN
    TURNER                                                                         7844    7698  SALESMAN  /KING/BLAKE/TURNER
    JAMES                                                                          7900    7698  CLERK     /KING/BLAKE/JAMES
  CLARK                                                                            7782    7839  MANAGER   /KING/CLARK
    MILLER                                                                         7934    7782  CLERK     /KING/CLARK/MILLER

 14  rows selected

Ответ корректен?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761520
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Piа как Вы в Dfitv коде получили доступ к удаленным записям? В MS SQL - это записи в deleted, а в ASA?

Код: plaintext
REFERENCING OLD AS ParentsDeleted
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761548
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PiASCRUS,
а как Вы в Dfitv коде получили доступ к удаленным записям? В MS SQL - это записи в deleted, а в ASA?
В ASA нет особых ограничений, как будут называться NEW и OLD внутри триггера, через опцию триггера REFERENCING им можно назначить любое удобное имя. С учетом того, что такие таблицы будут видны как временные из вызываемых с триггера процедур, то это удобно, если например у меня есть отдельно триггера на INSERT, UPDATE и DELETE и все они вызывают одну ХП, которой нужно по изменяемым записям что то сделать. В итоге достаточно во всех 3 триггерах назвать набор изменяемых данных одним именем и смело вызывать в каждом эту ХП.

PiОтвет корректен?
Если функция "sys_connect_by_path" является системной, то есть встроенна в Оракл, а не написана ручками Вами, то ответ корректен. Кстати я не вижу в запросе ORDER BY - в Оракл разрешается на рекурсивные запросы вешать сортировку и можно ли такие запросы использовать в качестве подзапросов ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761573
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть в ASA еще одна удобная фича, о которой, по-моему, почему-то до сих пор не упомянули - можно создать несколько триггеров каждого вида (before row level, before statement level...) и явно указать порядок их срабатывания. В Oracle, например, этого нет.
Про MS SQL я и не говорю :-)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761588
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS Если функция "sys_connect_by_path" является системной, то есть встроенна в Оракл, а не написана ручками Вами, то ответ корректен. Кстати я не вижу в запросе ORDER BY - в Оракл разрешается на рекурсивные запросы вешать сортировку и можно ли такие запросы использовать в качестве подзапросов ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
select LPAD(' ', 2 *(LEVEL- 1 )) || ename ename, 
    empno, mgr, job,  sys_connect_by_path( ename, '/' ) path   
    from emp
    start with ename='KING'
    connect by prior empno = mgr
    order by path;
QL> 

ENAME                                                                            EMPNO   MGR JOB       PATH
-------------------------------------------------------------------------------- ----- ----- --------- --------------------------------------------------------------------------------
KING                                                                               7839        PRESIDENT /KING
  BLAKE                                                                            7698    7839  MANAGER   /KING/BLAKE
    ALLEN                                                                          7499    7698  SALESMAN  /KING/BLAKE/ALLEN
    JAMES                                                                          7900    7698  CLERK     /KING/BLAKE/JAMES
    MARTIN                                                                         7654    7698  SALESMAN  /KING/BLAKE/MARTIN
    TURNER                                                                         7844    7698  SALESMAN  /KING/BLAKE/TURNER
    WARD                                                                           7521    7698  SALESMAN  /KING/BLAKE/WARD
  CLARK                                                                            7782    7839  MANAGER   /KING/CLARK
    MILLER                                                                         7934    7782  CLERK     /KING/CLARK/MILLER
  JONES                                                                            7566    7839  MANAGER   /KING/JONES
    FORD                                                                           7902    7566  ANALYST   /KING/JONES/FORD
      SMITH                                                                        7369    7902  CLERK     /KING/JONES/FORD/SMITH
    SCOTT                                                                          7788    7566  ANALYST   /KING/JONES/SCOTT
      ADAMS                                                                        7876    7788  CLERK     /KING/JONES/SCOTT/ADAMS

 14  rows selected
Oracle9i SQL Reference SYS_CONNECT_BY_PATH
Syntax
sys_connect_by_path::=


Text description of sys_connect_by_path


Purpose
SYS_CONNECT_BY_PATH is valid only in hierarchical queries. It returns the path of a column value from root to node, with column values separated by char for each row returned by CONNECT BY condition.

Both column and char can be any of the datatypes CHAR, VARCHAR2, NCHAR, or NVARCHAR2. The string returned is of VARCHAR2 datatype and is in the same character set as column.

See Also:
" Hierarchical Queries " for more information about hierarchical queries and CONNECT BY conditions
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761615
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pi НЕ выходя за пределы задачи, было предложены решения. Например, оказалось, что приведенный самим SergSuper код валится на 32 циклах вложенности. Подобный (подчеркну - подобный) код на Oracle валится на 50 вложениях.

Но есть обходные примеры, которые показали пока только на ASA и Oracle. Ждем подобных примеров на MS SQL! Желательно с проверкой на большом количестве данных - я указал возможную таблицу для тестирования.

А на самом деле предложенная г. SergSuper задача по-сути решается совсем по-другому - через FK on DELETE CASCADE.
Да эта задача решается через FK. Просто вопрос от задачи перешёл к сравнению возможностей тригеров. Вот и я в ту же степь... Задача проверки констрейнтов, не реализуемых стандартными методами, обычно и возлагается на тригеры. А эти констрейнты могут быть очень сложные и что в таком случае делать? Селект-то из таблицы не сделаешь в for each row. Вот и приходится всё делать через одно место. ;)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761629
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть в ASA еще одна удобная фича, о которой, по-моему, почему-то до сих пор не упомянули - можно создать несколько триггеров каждого вида (before row level, before statement level...) и явно указать порядок их срабатывания. В Oracle, например, этого нет.
Про MS SQL я и не говорю :-)

неправда ваша, дяденька! см. BOL sp_settriggerorder. Вот в чем горькая правда, так то, что триггер может быть только первым, последним или никаким :-).


Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761630
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL99Есть в ASA еще одна удобная фича, о которой, по-моему, почему-то до сих пор не упомянули - можно создать несколько триггеров каждого вида (before row level, before statement level...) и явно указать порядок их срабатывания. В Oracle, например, этого нет.
Про MS SQL я и не говорю :-)

PL99,
во-первых, я хотел бы Вас лично вместе с г. ASCRUS поблагодарить за разъяснение
Код: plaintext
1.
REFERENCING OLD AS ParentsDeleted
Спасибо!

Во-вторых, Ваш цитируемый пост чуть размыт, что позволяет сказать и "Вы правы", и "Вы не правы"

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

С другой стороны, зависимость правильности действия триггеров от порядка их исполнения для меня лично сомнительна! Я, кстати, напарывался на эти проблемы, когда сопровождал с пяток "почти" однотипных объектов. С тех поря я для себя решил, что если порядок важен - то значительно правильнее написать "коротко-транзакционные" процедуры, и вызывать их из одного триггера. И зная еще с 98 года что такое возможно в Interbase, никогда этого порядка не жаждал. Впрочем, может у Вас есть готовый пример?

А кстати - есть понятие "коротких" транзакций в ASA? "Короткие" - это те, при помощи которых Oracle, с незапамятных временApplication developers can improve the performance of short, nondistributed transactions by using the BEGIN_DISCRETE_TRANSACTION procedure
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761637
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky

Есть в ASA еще одна удобная фича, о которой, по-моему, почему-то до сих пор не упомянули - можно создать несколько триггеров каждого вида (before row level, before statement level...) и явно указать порядок их срабатывания. В Oracle, например, этого нет.
Про MS SQL я и не говорю :-)

неправда ваша, дяденька! см. BOL sp_settriggerorder. Вот в чем горькая правда, так то, что триггер может быть только первым, последним или никаким :-).


Posted via ActualForum NNTP Server 1.1

Хорошо бы указывать, где это. Не все здесь знают MS SQL.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761646
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, что-то товарищ Pi меня совсем как-то опустил.

Во-первых я хотел узнать каков принцип работы с записями в триггерах на разныз СУБД. И первые ответы ввергли меня в пессимизм. Почти как в анекдоте:
У чукчи спрашивают: какой народ самый глупый? А он отвечает: Зато у нас песни красивые!
Т.е. вместо того чтоб написать примеры триггеров народ пишет что у них зато есть рекурсивные запросы и автономные транзакции и как нехорошо использовать рекурсивные триггеры. Замечательно, но я то не об этом.
Потом товарищ Pi переписал к себе мой триггер, который я писал не особо задумываясь и естественно не проверяя, был вне себя от щастья нашедши синтаксическую ошибку, исправил, и был еще больше щаслив когда его(а якобы мой) триггер не работал как надо. Потом он решил триггер усовершенствовать, убрав условие выхода из рекурсии и стал меня укорять что я написал ерунду ( Пример в MS SQL, ВООБЩЕ ГОВОРЯ, НЕ РАБОТОСПОСОБЕН. Этот тот самый геморрой, о котором я имел место говорить ). Ну что ж мне не жалко, всегда готов сделать приятное человеку.

К щастью дискуссия не ушла во флейм и появились действительно рабочие примеры, за что всем не поленившимся написать большое спасибо. Кстати хотелось бы увидеть как это делается на DB2 и InterBase.
Так же выкладываю проверенный пример на MS SQL, если уж витает мысль оформить это типа ФАКа. Здесь уже не используются рекурсивные триггера, из-за чего надо писать не очень красивую конструкцию с циклом.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
create table tr( id int identity, parent int null, caption varchar( 99 ))

go

create trigger ttt on tr for delete as
begin
set nocount on
declare @t table(i int primary key, le int)
declare @le int
set @le= 0 
insert @t select t.id,  0  from deleted d, tr t where t.parent=d.id
while @@rowcount<> 0 
  begin
    set @le=@le+ 1 
    insert @t select id, @le 
      from @t, tr 
      where i=parent and le=@le -  1 
  end

delete tr
  from tr , @t
  where id=i
end

go
----------  Далее идёт заполнение тестовыми данными

insert tr select null, 'root'
declare @i int
set @i= 1 
while @i<= 1155 
begin
insert tr select rand()*@@identity+ 1 , 'Hello, Word!'
set @i=@i+ 1 
end
go

----------  Проверяем за какое же время оно удалиться

declare @d datetime
select @d=getdate()
delete tr where id= 1 
select datediff(ms, @d,getdate())

И теперь я подведу первичные итоги(надеюсь кто меня знает поймёт правильно):

1. Приведенный пример в Oracle выглядит сложнее. С этим я с товарищем Pi полностью согласен. Выражаясь его языком - выглядит как этот тот самый геморрой.

2. Пример в Oracle работает очень медленно. Я, чесно говоря, не знаю как товарищу Pi удалось так тормознуть неплохую железяку, но у меня удаление на гораздо более простом сервере занимает 0.173 с теми же 1155 записями. И это без индексов.

3. ВООБЩЕ ГОВОРЯ, не стоит судить о геморе в MS SQL и о работоспособности примеров имея весьма слабое о нём представление.

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

Поэтому прошу господ, ратующих за меганвороченность, вспоминать время от времени старую русскую поговорку -
Простота - залог надёжности
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761651
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот еще такая проблема.
В коде Oracle я могу
alter trigger Trigger_tr disable;
и, соответсвенно,
alter trigger Trigger_tr enable;

Уогда пересел на MS SQL (6.5), то необходимость
drop trigger Trigger_tr
(невозможность его отключить) приводила к полному безобразию - мы в Штаты гнали процедуры, которые дропали триггера и снова их ставили! Ну, у них там в судах Вирджинии народ делом занят, по системам сам не ползает, а представьте себе, если бы такой код поставили где-то здесь? Обязательно нашелся бы умник, который че-нибудь поменял бы в триггере, а потом бы удивлялся, чего все не так работает...

А как с этим у соседей? ASA? DB/2?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761657
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PiВы привели несколько триггеров разного времени исполнения, так их порядок предопределен и неизменяем. Если же говорить о нескольких триггерах одного типа - то таки да, и в 9-1 версии их порядок неопределен.Уточняю. Для нескольких before insert row level (например) триггеров можно явным образом указать порядок срабатывания.

PiС другой стороны, зависимость правильности действия триггеров от порядка их исполнения для меня лично сомнительна! Я, кстати, напарывался на эти проблемы, когда сопровождал с пяток "почти" однотипных объектов. С тех поря я для себя решил, что если порядок важен - то значительно правильнее написать "коротко-транзакционные" процедуры, и вызывать их из одного триггера. И зная еще с 98 года что такое возможно в Interbase, никогда этого порядка не жаждал. Впрочем, может у Вас есть готовый пример?Вы правы, но я исхожу из положения - лишней фичи не бывает... К сожалению, готового примера у меня нет, т.к. я уже 6 лет не работаю с ASA.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761699
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА вот еще такая проблема.
В коде Oracle я могу
alter trigger Trigger_tr disable;
и, соответсвенно,
alter trigger Trigger_tr enable;

Уогда пересел на MS SQL (6.5), то необходимость
drop trigger Trigger_tr
(невозможность его отключить) приводила к полному безобразию - мы в Штаты гнали процедуры, которые дропали триггера и снова их ставили! Ну, у них там в судах Вирджинии народ делом занят, по системам сам не ползает, а представьте себе, если бы такой код поставили где-то здесь? Обязательно нашелся бы умник, который че-нибудь поменял бы в триггере, а потом бы удивлялся, чего все не так работает...

А как с этим у соседей? ASA? DB/2?
Слишком старую версию Вы MSSQL вспомнили, сейчас там есть отключение триггеров на таблицу командой ALTER TABLE.

В ASA штатными средствами можно отключить только все триггера - через специальный параметр при запуске сервера (для всех сессий) или же установкой нужной темпоральной опции в сессии (только для этой сессии). Если хочется отключать отдельные группы триггеров, то все опять же разруливается через глобальные переменные, фактически мой пример на удаление по дереву триггера написанный выше как раз и демонстирует как отключить повторный рекурсивный вызов триггера. Кстати в ASA на соединение сессии можно указать автоматически запускать собственную ХП, в которой сразу же создавать и инициализировать нужные глобальные переменные, заполнять глобальные временные таблицы или даже проверить по какому то условию и дать от ворот поворот подключающейся сессии (например логин уже работает в БД или же кол-во одновременно подключаемых станций не может быть больше 10). Там же можно сразу по ходу подключения создавать/не создавать нужные глобальные переменные, если по логике необходимо включать или отключать группы триггеров. Вообще я считаю LOGIN процедуру чрезвычайно полезной фичой, позволяющей мне сразу же при начале коннекта сессии ее проинициализировать и подготовить к работе, что позволяет мне не только с клиентского приложения, но и с стандартных утилит ASA сразу под рукой иметь всю необходимую инициализацию без ручных вызов ХП (что не очень то сделаешь из под визуальных утилит ASA).
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761701
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuperТак, что-то товарищ Pi меня совсем как-то опустил.
...
Поэтому прошу господ, ратующих за меганвороченность, вспоминать время от времени старую русскую поговорку -
Простота - залог надёжности

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

Вот к примеру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
create table tr( id int identity, parent int null, caption varchar( 99 ))

go

create trigger ttt on tr for delete as
begin
set nocount on
declare @t table(i int primary key, le int)
declare @le int
set @le= 0 
insert @t select t.id,  0  from deleted d, tr t where t.parent=d.id
while @@rowcount<> 0 
  begin
    set @le=@le+ 1 
    insert @t select id, @le 
      from @t, tr 
      where i=parent and le=@le -  1 
  end

delete tr
  from tr , @t
  where id=i
end

go
----------  Далее идёт заполнение тестовыми данными

insert tr select null, 'root'
declare @i int
set @i= 1 
while @i<= 1155 
begin
insert tr select rand()*@@identity+ 1 , 'Hello, Word!'
set @i=@i+ 1 
end
go

declare @d datetime
select @d=getdate()
delete tr where id= 1 
select datediff(ms, @d,getdate())
MS SQL Server: Msg 217, Level 16, State 1, Procedure ttt, Line 17
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).

То есть, опять Ваш пример у меня не сработал! Честное слово, это Ваш пример, взятый с Вашего поста! Может, какие-то настройки сервера нужны?
Просьба указать их явно в коде.

ничто так не разнообразит жизнь как достойный противник
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761712
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create trigger ttt on tr for delete as
begin
set nocount on
declare @t table(i int primary key, le int)
declare @le int
set @le= 0 
insert @t select t.id,  0  from deleted d, tr t where t.parent=d.id
while @@rowcount<> 0 
  begin
    set @le=@le+ 1 
    insert @t select id, @le 
      from @t, tr 
      where i=parent and le=@le -  1 
  end

if exists( select * from @t )
  delete tr
    from tr , @t
    where id=i
end

P.S. Гм, я уже и писать чего то на TSQL разучился, хотел к IF прилепить THEN и END IF :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761714
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет, скорее всего надо отключить рекурсивное выполнение триггеров
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761715
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Слишком старую версию Вы MSSQL вспомнили, сейчас там есть отключение триггеров на таблицу командой ALTER TABLE.
...
Там же можно сразу по ходу подключения создавать/не создавать нужные глобальные переменные, если по логике необходимо включать или отключать группы триггеров. Вообще я считаю LOGIN процедуру чрезвычайно полезной фичой, позволяющей мне сразу же при начале коннекта сессии ее проинициализировать и подготовить к работе, что позволяет мне не только с клиентского приложения, но и с стандартных утилит ASA сразу под рукой иметь всю необходимую инициализацию без ручных вызов ХП (что не очень то сделаешь из под визуальных утилит ASA).

1. Эт-то точно!
2. Oracle9i Database Concepts Application Context
Application context facilitates the implementation of fine-grained access control. It lets you implement security policies with functions and then associate those security policies with applications. Each application can have its own application-specific context. Users are not allowed to arbitrarily change their context (for example, through SQL*Plus).

Application contexts permit flexible, parameter-based access control, based on attributes of interest to an application. For example, context attributes for a human resources application could include "position," "organizational unit," and "country," whereas attributes for an order-entry control might be "customer number" and "sales region".

You can:

Base predicates on context values
Use context values within predicates, as bind variables
Set user attributes
Access user attributes

Может, это из этого ряда.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761720
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuperДа нет, скорее всего надо отключить рекурсивное выполнение триггеров

Thank you, it helps! В таком виде работает:
Код: plaintext
exec sp_dboption 'Orcl64','recursive triggers','false'
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761724
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как командой не помню, в EM - для базы Properties/Options/Recurcive triggers - надо убрать галочку
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761744
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protector
Задача проверки констрейнтов, не реализуемых стандартными методами, обычно и возлагается на тригеры. А эти констрейнты могут быть очень сложные и что в таком случае делать? Селект-то из таблицы не сделаешь в for each row. Вот и приходится всё делать через одно место. ;)

Posted via ActualForum NNTP Server 1.1

Я сейчас поддерживаю систему, конкурирующую с SAP/R3. Так вот, она - система, - работает только на Oracle. В ней
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
OBJECT_TYPE              Q-ty
------------------ ----------
INDEX                     3314 
PACKAGE                   4566 
PACKAGE BODY              4560 
PROCEDURE                    2 
SEQUENCE                   402 
TABLE                     2651 
TRIGGER                    131 
VIEW                      5259 
разнообразных объектов, но - нет ни одного констрайнта. Нет, и все тут! И знаете - это очень удобно!
Ди из имеющихся 131 триггера все - поддержка системных функций (системных в смысле пакета, не в смысле Оракле).

Имеет смысл учесть. Впрочем, я не очень представляю себе, как это сделать в таком объеме на MS SQL. Пакетов там по-прежнему нет... Или я не прав?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761756
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot SergSuper]
К щастью дискуссия не ушла во флейм и появились действительно рабочие примеры, за что всем не поленившимся написать большое спасибо. Кстати хотелось бы увидеть как это делается на DB2 и InterBase.
[quot]
Что-ж выкладываю пример для Interbase. Так-же полный скрипт.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE TR (
    ID       INTEGER NOT NULL,
    PARENT   INTEGER,
    CAPTION  VARCHAR( 99 )
);

CREATE TRIGGER TR_AD0 FOR TR
ACTIVE AFTER DELETE POSITION  0 
AS
begin
  delete from tr where parent = old.id;
end;

Заполнил 700 записей через генератор тестовых данных IBExpert. Потом сделал.

Код: plaintext
1.
  update tr set parent = id- 1 
Таким образом глубина вложенности дерева = 700
Тригер такой
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TRIGGER TR_AD0 FOR TR
ACTIVE AFTER DELETE POSITION  0 
AS
begin
  delete from tr where parent = old.id;
end
Выполняем:
Код: plaintext
delete from tr where parent= 0 
Всё ок. Время вполне приемлимое 450мс. Хотя производительность сильно зависит от нагрузки на базу. имерятся тут ИМХО нечем.
Сразу скажу, что при глубине дерева более 700 этот тригер работать не будет, т.к. ограничении 700 рекурсивных вызовов для Винды и 1000 для Linux.
Согласитесь, что тригер в одну строчку писать всегда приятней :)





Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761775
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pi
protector

Задача проверки констрейнтов, не реализуемых стандартными методами, обычно и возлагается на тригеры. А эти констрейнты могут быть очень сложные и что в таком случае делать? Селект-то из таблицы не сделаешь в for each row. Вот и приходится всё делать через одно место. ;)


Я сейчас поддерживаю систему, конкурирующую с SAP/R3. Так вот, она - система, - работает только на
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Oracle. В ней OBJECT_TYPE              Q-ty
------------------ ----------
INDEX                     3314 
PACKAGE                   4566 
PACKAGE BODY              4560 
PROCEDURE                    2 
SEQUENCE                   402 
TABLE                     2651 
TRIGGER                    131 
VIEW                      5259 
разных объектов, но - нет ни одного констрайнта. Нет, и все тут! И знаете - это очень удобно!

А интересно, почему их там нет? И как поддерживается целостность данных? Через клиента? И чем удобно отсутствие констрейнтов?

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761824
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protector
А интересно, почему их там нет? И как поддерживается целостность данных? Через клиента? И чем удобно отсутствие констрейнтов?

1. Если бы логика поддерживалась клиентом - то тогда откуда бы взялась поддержка исключительно на Оракле? Нелогично, согласитесь! На самом деле архитектура - "правильная" трехслойная (см. картинку)

2. Вся бизнес-логика поддерживается через пакеты Оракла. Вот почему их так много - см. мой пост выше. Кстати, система полностью объектная! Насколько я знаю, она - единственная полностью объектная в первой мировой пятерке пакетов класса Business Suite.

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

Конечно, система имеет свои правила - а как бы иначе объектная прикладная система могла бы существовать на необъектнем Оракле, например, версии 7.3 или раньше? Так вот, отказавшись от констрейнтов ,разарботчики построили свою систему правил, и приняв ее, ты оказываешься в предсказуемом мире.

Кроме того, система теперь может работать в распределенном режиме. Надеюсь, распространяться об ограничениях на системные констрайнты в распределенном мире с поддержкой синхронизации не приходится.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761830
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что ж, пятница удалась, нормально поговорили.

А все же, сможет ли кто-нибудь сказать мне причины проблемы в моем посте от 29 Октября, 14:31 в этой ветке
Код: plaintext
1.
2.
3.
select sum(store_sales) Sum from sales_fact_1997 t
where customer_id =  2094 
and product_id= 173 ;
...

Очень хотелось бы услышать ответ. Можно здесь, а можно и здесь

Этот вопрос как раз из тех, что показывают разницу в парадигмах...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761831
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, а есть ли на этом сайте указывать ссылку на конкретный пост?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761899
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PiКстати, а есть ли на этом сайте указывать ссылку на конкретный пост?
Есть :) Нажмите на id нужного сообщения и скопируйте с адресной строки браузера ссылку.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761903
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
1. Приведенный пример в Oracle выглядит сложнее. С этим я с товарищем Pi полностью согласен. Выражаясь его языком - выглядит как этот тот самый геморрой.

Но приведенный пример и на SQL не выглядит привлекательно (я, например не врач геммороев не видел, не могу сравнить с ними примеры).
Кроме того, если сравнивать примеры, то нужно отметить, что ради выполнения одного триггера в MS SQL понадобилось настраивать опцию всей БД - отключение рекурсий. А если для дркугого триггера она все-таки нужна? Что они будут делать вместе? Нет в примере Оракла и циклов, но есть пакет (ради реализации того, что в ASA делает глобальная переменная). И то и другое есть некоторое отдаление от SQL - языка БД в сторону процедурного языка. А задача внешне выглядит как не требующая ничего кроме триггера и в нем только DML.
Возможно, в дальнейших усовершенствованиях нуждаются и триггера и, наверное, SQL для приведенных СУБД. Наверное, эта ситуация будет улучшаться в дальнейших версиях.
Все-таки,пока кажется, что в примере для Оракла в этом смысле непроцедурности больше, чем в MS SQL т.е. больше языка БД. Там непроцедурность связана только с обходом рекурсий, с данными работает один запрос в триггере, без циклов (этой печати процедурности). Речь конечно идет только о приведенных примерах.
Примеры ASA и Inerbase немного выглядят получше. Но я не понял, это глобальная переменная сессии или где ее область видимости? Не может быть конфлитка из-за нее между сессиями или транзакциями?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761909
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Насколько я понимаю, чтобы все это проделать в Оракле одним чистым запросом отделаться нельзя будет.

Возможно. Но привидите пример, когда в Оракле одним чистым запросом отделаться нельзя будет, а в ASA можно. Хотелось бы посмотреть.
Хотя ясно, что это все уже выходит за пределы реляционной алгебры. Т.е. производители СУБД, отвечая требованиям стремятся расширять SQL в сторону не выразимых в реляционной алгебре запросов. В данном случае транзитивных замыканий.
У меня тоже найдется, наверное, интересный пример запроса для того, чтобы посмотреть как это у Вас.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761921
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, в примере Оракла тоже есть цикл, не внимательно посмотрел.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761923
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo Но приведенный пример и на SQL не выглядит привлекательно (я, например не врач геммороев не видел, не могу сравнить с ними примеры).
Да это ж я над Pi иронизировал, неужели можно было серьёзно воспринимать?
Но кстати и по количеству строчек и по количеству идентификаторов на MS SQL короче...

vadiminfo нужно отметить, что ради выполнения одного триггера в MS SQL понадобилось настраивать опцию всей БД - отключение рекурсий. А если для дркугого триггера она все-таки нужна?
Я лично никогда не ставлю рекурсивность триггеров. Её ввели с 7-й версии непонятно зачем. Мне тоже кажется это неудачным решением - установкой одной галочки меняется вся логика базы. А здесь привел пример для такой настройки чтоб наглядней было. Лучше б сразу написал почеловечески :)

vadiminfo Все-таки,пока кажется, что в примере для Оракла в этом смысле непроцедурности больше, чем в MS SQL т.е. больше языка БД.
А копирование записей по одной из одной таблицы в другую - тоже процедурностью отдаёт.
Чем мне нравится на MS SQL и особенно на SyBase - нет операций по одной записи и нет рекурсий, а в последнем еще и цикла. А кстати что - удалять с помощью рекурсивного запроса нельзя? Может удалось бы обойтись без временной таблицы?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761926
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я переписал Оракловый триггер из примера, который привел softwarer, чтобы в нем не было цикла. Он сработал на том же примере, что привел softwarer.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create or replace trigger ad_parented_cascade_s
  after delete on parented
begin
  if parented_deleting.into_cascade then return ; end if ;
  parented_deleting.into_cascade := true ;

delete from parented 
 where id in 
  (select id from parented   
    start with parent_id = parented_deleting.id 
    connect by prior id = parent_id
    );


  parented_deleting.into_cascade := false ;
exception 
  when others then
    parented_deleting.into_cascade := false ;
    raise ;
end ;


Конечно, все это может быть нуждается в более глубоком тестировании.

Я по прежнему думаю, что главное не то что бы работало любой ценой, а чтобы средства решения задачи максимально соотносились с ней. В частности, удаление данных - это то для чего есть язык БД. Триггеры - это просто способ выполнить нужные инструкции DML в ответ на изменение данных. Т.е. мы могли бы говорить о триггерах SQL. Это имеет значение и для модели данных. Она лучше читается. И соответственно упрощается разработка и сопровождение. Конечно, в сложных случаях языка БД может не хватить для удаления данных, связанных между собой достаточно сложно. Но это недостаток языка БД. В данном случае версия SQL Оракла позволяет удалить легко, но чтобы реализовать каскадное удаление все еще нужны средства PL/SQL.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761928
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА кстати что - удалять с помощью рекурсивного запроса нельзя? Может удалось бы обойтись без временной таблицы?
Ну если засунуть его в представление или хранимку (они могут использоваться как параметризированные представления в запросах), то можно :) Вполне возможно в выходящей 9.0.2 такие проблемы синтаксиса будут решены вообще окончательно - довольно долго на форуме обсуждения развития ASA шла дискуссия о вводе в семантику WatcomSQL возможности обьявления временного представления с поддержкой области видимости, фактически это аналог COMMON TABLE EXPRESSION, но не на SELECT, а на весь блок BEGIN...END и всего, что из него вызывается. Если сделают, будет замечательно. Сейчас я пока только узнал про 9.0.2, что там будет опция ограничения ресурсов на сессию, позволяющая устанавливать квоту на использование размера временных таблиц и вес обрабатываемых запросов - я так понимаю разработчики ASA не зря 6 последних месяцев так много общались на форумах с ораклистами, которые в том числе работают на ASA и готовы рассказать, чего же им не хватает по сравнению с Ораклом. Если они будут так же продолжать придерживаться текущих мировозрений: "Простота без ограничений - залог успеха" и "Развитие продукта зависит от потребностей пользователей, а не политики менеджеров", плюс дальше тащить лучшие решения с других СУБД, то лично я только ЗА :) Кстати вполне допускаю мысль что действительно довольно динамичное развитие ASA связано с тем, что во первых Sybase сосредоточен на своей ASE, он не вмешивается в дела дочерней iAnywhere (бывший Watcom) и главное - у него действительно плохо с менеджментом, так что в реале ASA развивается только по пожеланиям ее пользователей и наверное может у них там считаться настоящей "народной" коммерческой СУБД. Наглядный пример этого - на фоне того, что ASA стала еще и веб-сервером, сейчас с удовольствием подключились к ее развитию веб-интерфейсов PHP-шники и в этом направлении она уже стала из месяца в месяц расти и расширяться :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761929
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ по прежнему думаю, что главное не то что бы работало любой ценой, а чтобы средства решения задачи максимально соотносились с ней. В частности, удаление данных - это то для чего есть язык БД. Триггеры - это просто способ выполнить нужные инструкции DML в ответ на изменение данных. Т.е. мы могли бы говорить о триггерах SQL. Это имеет значение и для модели данных. Она лучше читается. И соответственно упрощается разработка и сопровождение. Конечно, в сложных случаях языка БД может не хватить для удаления данных, связанных между собой достаточно сложно. Но это недостаток языка БД. В данном случае версия SQL Оракла позволяет удалить легко, но чтобы реализовать каскадное удаление все еще нужны средства PL/SQL.
Я не очень понимаю между Вашими терминами "язык БД", "DML" и "PL/SQL" (который все еще нужен). У меня в ASA есть диалект WatcomSQL, который обхватывает собой все - DDL, DML, язык хранимых процедур, расширения, администрирование и резервное копирование, репликацию, защиту и даже обработку HTML и XML и создание различных видов веб-сервисов. В нем так же можно работать и с обьектами Java как родными, хранить сериализованные обьекты Java в полях таблиц и обрабатывать их в запросах, обращаясь к полям и методам обьектов записей (правда Java тут ни разу и не пригодилась). Разве в Оракле PL/SQL не является таким же единым стандартном, почему Вы ему отводите только роль языка хранимых процедур ?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761939
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Я не очень понимаю между Вашими терминами "язык БД", "DML" и "PL/SQL" (который все еще нужен).

Язык БД(DL) - в данном случае SQL, точнее его диалект. DML - язык манипулирования данными - подязык языка БД, наряду с DDL - языком описания данных. Я придаю им значение поскольку они собственно и реализуют модель данных БД. В частности, DML реализует компоненту модели - манипулирование данными. Удаление - входит в это манипулирование. Про PL/SQL я сказал, что он все еще нужен там, где должно было хватить DL. Т.е. речь шла конкрето об удалении, а не вообще о всех задачах связанных с БД.

ASCRUS
). У меня в ASA есть диалект WatcomSQL, который обхватывает собой все - DDL, DML, язык хранимых процедур, расширения, администрирование и резервное копирование, репликацию, защиту и даже обработку HTML и XML и создание различных видов веб-сервисов. В нем так же можно работать и с обьектами Java как родными, хранить сериализованные обьекты Java в полях таблиц и обрабатывать их в запросах, обращаясь к полям и методам обьектов записей (правда Java тут ни разу и не пригодилась). Разве в Оракле PL/SQL не является таким же единым стандартном, почему Вы ему отводите только роль языка хранимых процедур ?

Эти средства выходят за рамки модели данных - тут уже элементы приложения пошли. Тут другое дело. PL/SQL - язык хранимых процедур. И для Java у Оракла есть даже своя машина. И тоже может запускаться из PL/SQL Java.
Более того, Оракл поддерживает Объектно реляционную модель данных, полуструктурированную модель данных XML, элементы документальных и геоинформационных моделей. Более того, вложенные таблицы Оракла некоторые относят к сетевым моделям данных. Репликацию он поддерживает и систему сробщений. Да и много еще чего. Я слышал, что полная дока по Ораклу 10 000 страниц.

Я про другое. Реляционная модель все-таки базовая модель Оракла. Модель данных играет важную роль в технолгиях БД. И потому все что ее касается, желательно реализовать по возможномти на языке БД. В частности, удаление. Конечно, в реляционную модель, не входят, например, ограничения целостности общего вида. Или нужно много разных команд DL запускать из приложения. Или реализовывать часть логики приложения на сервере БД. Тогда естественно, что язык БД на это и не расчитан. Тогда PL/SQL. Или Java, если не хватает PL/SQL. А для удаления применение процедурных языков выглядит как заплатка. Это уже все-таки пошли программные ухищрения.

Кстати, насчет стандартов. Про какие стандарты Вы говорите? Язык БД - SQL имеет стандарты. С++ имеет. А PL/SQL наверное не собираются подгонять ни под какие стандарты. Кстати, стандарты по SQL писались с учетом ведущих СУБД, где Оракл учитывался. Я почитываю толстые книги по БД вообще и там часто вижу Оракловый синтаксис. Сегодня в связи с нашим общением здесь заглянул в одну такую книгу. Там в разделе Триггера (я хотел про концепцию триггеров вообще посмотреть) описываются Оракловые. NEW и OLD есть, а про inserted и deleted ни слова. Хотя с другой стороны, это еще ничего не значит.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32761947
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper большое спасибо, впервые увидел, как адепты разных платформ достаточно продуктивно обменивались методами решения одной из задач, что характерно, без (ну почти) гнутия пальцев. Ведь могут :)
Кстати, можно не убирать рекурсивность триггеров в Вашем примере, достаточно в первой строке вставить нечто вроде
Код: plaintext
IF TRIGGER_NESTLEVEL() >  1  RETURN
. Обычно пользую в подобных ситуациях именно с целью избегания рекурсивного срабатывания триггеров.

Пока читал дискуссию, не раз возникало сожаление, что разные "вкусности" "живут" в разных платформах, и нет ни одной, на которой было бы все. Отдельное спасибо ASCRUS, ему не программированием заниматься надо, а идти в менеджеры по продажам, возможно платформа Sybase получила бы большее распространение, нежели сейчас. Шальная мысль, может и правда перейти на ASA ? :) vadiminfoописываются Оракловые. NEW и OLD есть, а про inserted и deleted ни слова.NEW и OLD есть не только у Oracle, что, впрочем не важно. Насколько я понимаю, то процедурные расширения на данный момент выходят за рамки стандарта и отданы на откуп производителям СУБД, хотя и есть робкие попытки все таки его выработать. Лично мне кажется, что время уже упущено, так как по историческим причинам каждый производитель уже так долго следует своим курсом, что загнать всех на одно шоссе практических шансов нет. Тем более, что многие "фичи" часто тесно связаны с особенностью реализаций соответствующих engine.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32762998
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL99Есть в ASA еще одна удобная фича, о которой, по-моему, почему-то до сих пор не упомянули - можно создать несколько триггеров каждого вида
Фича удобная - но я в какой-то момент пришел к выводу, что она скорее вредна. Причина - она не дает принципиальных преимуществ, но подталкивает к плохому стилю программирования.

Имхо: если триггера абсолютно независимы (чаще всего это бывает, когда навешены некие "стандартные", часто автосгенерированные триггера - типа аудита) - все, в общем, нормально, и порядок выполнения постановочно не при чем.

Если же порядок имеет значение - надо выделить подпрограммы (вообще в триггерах лучше не писать "большого" кода, имхо), а в триггере явно вызывать их в нужном порядке. Во-первых, это "читабельнее", а во-вторых - снимает вторичные проблемы (например - что будет, если я сделаю disable среднему триггеру в такой цепочке? полагаю - ничего хорошего).
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32763010
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PiКогда пересел на MS SQL (6.5), то необходимость
drop trigger Trigger_tr (невозможность его отключить) приводила к полному безобразию
Думаю, такие недоработки бывают везде. Хотя на вашем месте я бы написал процедурку, которая перед дропом сохраняла бы текст дропаемых объектов ;)

Так, в Оракле до девятой, кажется, версии вместе с ключом дропался индекс, поддерживающий этот ключ ("вместе" - это в смысле disable constraint приводил к удалению индекса). И пока не было deferrable constraint-ов, это было весьма неудобно - надо провести "тихий" хак, а тут дропается индекс и все пользователи это живо ощущают. Сейчас, правда, есть и deferrable и нормальная возможность сохранить индекс.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32763030
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoЯ переписал Оракловый триггер из примера, который привел softwarer, чтобы в нем не было цикла. Он сработал на том же примере, что привел softwarer.
Вполне нормально. К сожалению, я публиковался очень наспех.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32763041
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAОтдельное спасибо ASCRUS, ему не программированием заниматься надо, а идти в менеджеры по продажам, возможно платформа Sybase получила бы большее распространение, нежели сейчас. Шальная мысль, может и правда перейти на ASA ? :)
К сожалению, "удобство программирования" является далеко не первым из возможных аргументов в пользу выбора той или иной СУБД. Хотя свою и заметную цену, безусловно, имеет.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32763427
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA без (ну почти) гнутия пальцев. Ведь могут
softwarer"удобство программирования" является далеко не первым из возможных аргументов в пользу выбора той или иной СУБДКак бы, в курсе...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32763593
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-то спрашивал как будет для DB2. Я устал перечитывать переделал триггер
ASCRUS'a

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TRIGGER ProductGroup_DeleteChild AFTER DELETE
REFERENCING OLD AS ParentsDeleted
FOR EACH STATEMENT
BEGIN

  // Получаем дочерние ноды через рекурсивный запрос и удаляем их
 DELETE FROM  ProductGroup WHERE ProductGroup_id IN
    WITH h (Parent_id, Node_id) AS (
      SELECT Parent_id, ProductGroup_id
      FROM ProductGroup
      WHERE Parent_id IN (
              SELECT ProductGroup_id
              FROM ParentsDeleted )
      UNION ALL
      SELECT g.Parent_id, g.ProductGroup_id
      FROM ProductGroup g
        INNER JOIN h ON h.Node_id = g.Parent_id )
    SELECT Node_id
    FROM h;

// Обработка ошибок в теле триггера

END;
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32763725
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как минимум забыли указать в триггере строчку:
Код: plaintext
ORDER  1  ON ProductGroup
Плюс подзапрос в IN по идее нужно взять в ( ).

P.S. Как все таки мы похожи :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32763815
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuperА кстати что - удалять с помощью рекурсивного запроса нельзя? Может удалось бы обойтись без временной таблицы?

1.
Код: plaintext
1.
2.
3.
delete from parented   
    start with parent_id = parented_deleting.id 
    connect by prior id = parent_id;
напрямую не пройдет, а вот
Код: plaintext
1.
2.
3.
4.
5.
6.
delete from parented 
 where id in 
  (select id from parented   
    start with parent_id = parented_deleting.id 
    connect by prior id = parent_id
    );
работает.

2. Временную таблицу я лично использовал потому, что в Oracle триггер на строку работает как короткая транзакция, а потому не имеет права обращаться к другим строкам таблицы. Тем более удалять их.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32764003
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper
А кстати что - удалять с помощью рекурсивного запроса нельзя? Может удалось бы обойтись без временной таблицы?

Там не временная таблица, а ассоциативный массив был. Я потом исправил пример softwarer, чтобы убрать и массив и циклы. Но в Оракле нет рекурсивных запросов, а есть иерархические. Он и был использован. У softwarer не было времени на тестирование когда он писал, и поэтому он написал вариант, который точно сработает. А с иерархическим запросом были опасения насчет констрейнов, так он мог удалять не в том порядке. softwarer согласился, что это исправление должно работать. Т.е. в данном примере то сработал, а вот во всех случаях возможно пришлось бы проверять.
Ассоциативный массив - это таблица PL/SQL (он так и назывался в 7 версии). Т.е. это таблица не является объектом БД, это переменная PL/SQL.

А временная таблица в Оракле объект БД, и хранится в схеме. Часто народ вместо массивов ее применяет в подобных случаях (сам не видел, но вычитал в инете про это), но кажется это было бы не рационально. Она подходит для каких-то больших вычислений, если выразительной силы запросов не хватает, чтобы держать там промежуточный результат. В Опкле ее содержание может храниться в пределах сессии или транзакции, и поэтому пользователи или транзакции не мешают друг другу. Я когда-то делал систему на Access. Там сила запросов слабовата. Вполть до того, что в какой-то момент система говорит, что выражение слишком сложное. Там нет временных таблиц. И для промежеточных результатов пришлось делать обычные. Но эти результаты видны во всех сессиях. Пользователи мешают друг другу. Пришлось делать на клиенте по маленькой БД для этих таблиц и присоединять их к основной.

Вот то, что нет в Оракле рекурсивных запросов, пока мне не ясно. Что это значит? Появятся они или нет? И на сколько повысится выразительная сила запросов. Может ASCRUS приведет пример для прояснения. У Оракла в 8 версии не было JOIN, а в 9 появились. Может так будет и с рекурсивными, если они есть в стандартах SQL. Однако, у Оракла есть аналитические функции, некоторые из которых способны заменить самосоединения. Поэтому я тоже в этом духе предложу ASCRUS запрос, чтобы посмотреть как у него он будет вылядеть.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32764039
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoУ Оракла в 8 версии не было JOIN, а в 9 появились.


У Оракла в 8 версии не было JOIN - синтаксиса (который для меня кажется корявым), а был свой - "=", "+=" и "=+". Свой, естественно, был уже давно, я не знаю даже с какой версии...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32764053
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот, кстати, вспомнилась проблема, связанная с join.

Создаю представление:
Код: plaintext
1.
2.
3.
create view WrongJoin as
SELECT account.account_parent, account.account_description, expense_fact.*
FROM expense_fact 
  LEFT JOIN account ON expense_fact.account_id = account.account_parent

и теперь спрашиваю, сколько в ней записей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select count(*) from WrongJoin
where account_parent is null
GO
select count(*) from WrongJoin
where account_parent is NOT null
GO
select count(*) from WrongJoin
GO
MS SQL Server 2000 SP31800
2400
4200

Получается, что сумма больше, чем сумма слагаемых....
Или я что-то упустил?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32764063
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pi
У Оракла в 8 версии не было JOIN - синтаксиса (который для меня кажется корявым), а был свой - "=", "+=" и "=+". Свой, естественно, был уже давно, я не знаю даже с какой версии...

Это не просто синтаксис соединения. В стандарте SQL1 не было внешних соединений. Но там было внутренне с "=". Так как потребность во внешних была очевидна, то производители СУБД пошли по пути более простого синтаксиса для потребителей. В Оракле "(+) =", "=(+)". В MS SQL для этого использовалась * причем с противополжным значением. Разработчики стандартов использут достижения производителей, и стараются по возможности использовать то, что уже есть. Но в вопросе с соединениями они проявили жесткость, и в SQL2 появился JOIN. Это более строгий синтаксис. Он отделяет условие на соединение от предолжения WHERE, и позволяет более строго определить порядок соединения. А без этого не всегда ясен результат был. В Оракле кроме того "(+) =", "=(+)" накладывает ограничения на использование в WHERE OR, по-моему. Я уже не говорю про FULL JOIN. Так или иначе испопользуя JOIN, меньше надо опасаться сюрпризов и тратить время на тестирование. Я теперь пишу с удовольствием JOIN и для внутренненго соединения (вместо "="). Мне кажется так легче читать запрос - явно указывается операция.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32764254
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
USE pubs
GO
CREATE TABLE  accounts(id int not null , acc_description varchar( 20 ) null)
GO 
CREATE TABLE expense_fact(acc_id int not null, value  int null)
GO
CREATE VIEW Right_Join as
  select a.id, a.acc_description, e.*
      from expense_fact e LEFT JOIN accounts a 
			ON e.acc_id = a.id
GO

insert into accounts(id, acc_description)
  select  1 , 'Account 1'
  union all select  2 , 'Account 2'

insert into expense_fact(acc_id, value)
  select  1 ,  10 
  union all select  1 ,  20 
  union all select  2 ,  30 
  union all select  2 ,  40 
  union all select  3 ,  50 
  union all select  4 ,  60   
GO

SELECT count(*) from Right_Join where id is null
SELECT count(*) from Right_Join where id is not null
SELECT count(*) from Right_Join

GO
DROP TABLE accounts
GO
DROP TABLE expense_fact

результаты
 2 
 4 
 6 

select @@version

Microsoft SQL Server   7 . 00  -  7 . 00 . 699  (Intel X86) 
	May  21   1999   14 : 08 : 18  
	Copyright (c)  1988 - 1998  Microsoft Corporation
	Standard Edition on Windows NT  4 . 0  (Build  1381 : Service Pack  6 )

на

Microsoft SQL Server   2000  -  8 . 00 . 534  (Intel X86) 
	Nov  19   2001   13 : 23 : 50  
	Copyright (c)  1988 - 2000  Microsoft Corporation
	Enterprise Edition on Windows NT  5 . 0  (Build  2195 : Service Pack  3 )

точно такой же результат, что неудивительно ))
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32764339
DmitryV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PiА вот, кстати, вспомнилась проблема, связанная с join.
MS SQL Server 2000 SP31800
2400
4200

Получается, что сумма больше, чем сумма слагаемых....
Или я что-то упустил?

Может я чего-то не понимаю, но 1800+2400=4200. Где я ошибся? ;-)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32765012
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoВ Оракле кроме того "(+) =", "=(+)" накладывает ограничения на использование в WHERE OR, по-моему. Я уже не говорю про FULL JOIN.

Угу, там много ограничений было.

vadiminfoТак или иначе испопользуя JOIN, меньше надо опасаться сюрпризов и тратить время на тестирование.


Мне шибко поплохело, когда я на Оракле выполнил вот это:

Код: plaintext
select * from dual d1 left join dual d2 on  1  =  0 

No comments. Потом полезли глюки из оптимизатора, от вывернутых наизнанку планов до неправильных результатов запроса. В общем, весело там у них с явными джойнами...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32765126
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
db2

Код: plaintext
1.
C:\>db2 select * from sysibm.sysdummy1 d1 left join sysibm.sysdummy1 d2 on  1  =  0 

Код: plaintext
1.
2.
3.
4.
5.
6.
IBMREQD IBMREQD
------- -------
Y       -

  1 record(s) selected.



oracle

Код: plaintext
1.
2.
select * from dual d1 left join dual d2 on  1  =  0 
/

Код: plaintext
1.
строки не выбраны
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32765128
Pi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryV PiА вот, кстати, вспомнилась проблема, связанная с join.
MS SQL Server 2000 SP31800
2400
4200

Получается, что сумма больше, чем сумма слагаемых....
Или я что-то упустил?

Может я чего-то не понимаю, но 1800+2400=4200. Где я ошибся? ;-)

Вчера вечером я был уверен, что 4200 - 2400 = 2400... Sorry!

Вредно сразу после выборов выходить на работу...
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32765753
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewYear
db2
Код: plaintext
1.
C:\>db2 select * from sysibm.sysdummy1 d1 left join sysibm.sysdummy1 d2 on  1  =  0 
IBMREQD IBMREQD------- -------Y - 1 record(s) selected.

oracle
Код: plaintext
1.
2.
select * from dual d1 left join dual d2 on  1  =  0 
/
строки не выбраны

Интересный вопрос.
Порылся в лит-ре чтобы понять, что же должен вернуть запрос с JOIN, если в условии на соединение нет ссылок на столбцы и значение FALSE. Ничего не нашел. Интуитивно думал, что тоже что и в db2, но раз в Оракле иначе, то теперь и не знаю.
Если написать условие со ссылками на столбцы и через and добавить 1 = 0, то последнее не влияет на результат. И вроде ему там не место, а место в where.
Так же, вроде, не влияет перенос из where и других условий в on. т.е. как будто их нет там.
Однажды не выспался и очень торопился и втюхал через and условие отбора в on вместо того, чтобы вставить в where. И никак не мого понять что за результат. Только через пол часа въехал. Хотел с тех пор повнимательнее разобраться с этим, но руки не доходили. И вот теперь здесь подняли этот вопрос. Интересно все это.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32765823
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли написать условие со ссылками на столбцы и через and добавить 1 = 0, то последнее не влияет на результат. И вроде ему там не место, а место в where.
Почему это не место. По условию задачи как раз самое место - возвращаем записи из первой таблицы, со второй записей быть не должно, но ее поля в запросе присутствовать должны. И на ASA будет так же:
Код: plaintext
1.
2.
SELECT * 
FROM dummy d1 
  LEFT JOIN dummy d2 on  1  =  0 ;
результат:
dummy_coldummy_col0(NULL)
по идее без разницы что за условие стоит в "on", задача оптимизатора по нему правильно соединить, желательно без лишних движений - в ASA например на такой запрос перед d2 будет поставлен "prefilter" с предикатом "false", который не позволит чего нибудь выбирать из d2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
( Plan [ Total Cost Estimate: .000511 ] 
  ( Left Outer NestedLoopsJoin[ TRUE ]
    ( TableScan ( DUMMY d1 ) )
    ( PreFilter [ FALSE ]
      ( TableScan ( DUMMY d2 ) )
    )
  )
)


Если Оракл не делает так же, то значит чего то у него не в порядке с JOIN-ами.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32765918
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Если Оракл не делает так же, то значит чего то у него не в порядке с JOIN-ами.
В Оракуле всё в порядке с джойнами, только с оракловыми, а с явными что-то не то. К тому-же нарушается совместимость, а многие до сих пор сидят на восьмерке и даже на семерке. Кстати, что будет, если в укзать якный джойн и обычный оракловый в одном запросе. Кстати мне синтаксис с (+) нравится больше. Удобней и понятней ИМХО.


Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32766103
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Почему это не место. По условию задачи как раз самое место - возвращаем записи из первой таблицы, со второй записей быть не должно, но ее поля в запросе присутствовать должны.

Интуитивно то так. Но более формально, JOIN операция соединения, а ON условие на соединение. В соединении обязаны присутствать столбцы по которым осуществляется соединение в силу самого определения операции соединения в реляционной алгебре. Иначе что это за соединение? Есть декартово произведение, там нет условия на соединение. Для выборки условия записываются в WHERE. Тут вопрос в том как теперь должны распеределяться условия между ON и WHERE.
Но то что опять один запрос вернет разные результаты в разных БД это важная для меня инфа. Здорово, что мы здесь обмениваеся такой инфой.
ASCRUS
по идее без разницы что за условие стоит в "on", задача оптимизатора по нему правильно соединить, желательно без лишних движений - в ASA например на такой запрос перед d2 будет поставлен "prefilter" с предикатом "false", который не позволит чего нибудь выбирать из d2:

Причем тут оптимизатор? Его дело выбрать лучший алгоритм выполни запроса.
Т.е. он отвечает за то как извлечь лучше. А мы говорим про то что нужно извлечь.
Такой результат как у Вас можно извлечь в Оракле, но классическими для соединений условиями - явное указание столбцов, по которым должно быть соединение, наприер
select * from dual d1 left join dual d2 on d1.dummy = d2.dummy || d2.dummy

вернет

dummy dummy
Х -

Но вопрос до конца не ясен. Нужно понять достоинство и недостатки того как работают условия выборки в условии на сединение.


protector
В Оракуле всё в порядке с джойнами, только с оракловыми, а с явными что-то не то. К тому-же нарушается совместимость, а многие до сих пор сидят на восьмерке и даже на семерке. Кстати, что будет, если в укзать якный джойн и обычный оракловый в одном запросе. Кстати мне синтаксис с (+) нравится больше. Удобней и понятней ИМХО.


На (+) есть ограничения, не ясен порядок, нет FULL JOIN. Ни комитету по стандартам, ни самому Ораклу, в конце концов, синтаксис не понравился. В доке Оракл пишет про его недостатки.
Он был вызван стремлением не написать, чего то более сложного для пользователей, чем другие производители СУБД. И вряди он понятней - пишется в условиях отбора, тогда как соединение отличная от выборки операция в рел алгебре. Архиважная, впрочем как и выборка.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32766230
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoИнтуитивно то так. Но более формально, JOIN операция соединения, а ON условие на соединение. В соединении обязаны присутствать столбцы по которым осуществляется соединение в силу самого определения операции соединения в реляционной алгебре. Иначе что это за соединение?

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

vadiminfoТут вопрос в том как теперь должны распределяться условия между ON и WHERE.

Для внутренних джойнов это монопенисуально, результат будет единым. Для внешних распределение условий задает программист, ибо результаты могут быть шибко разные. Условие соединения уходит в ON, а фильтр на результат - в WHERE. И никакая самодеятельность со стороны сервера тут недопустима.

vadiminfoНо то что опять один запрос вернет разные результаты в разных БД это важная для меня инфа. Здорово, что мы здесь обмениваеся такой инфой.

Угу. Если поиграться, то можно еще несколько приколов нарыть у Оракла на эту тему. Но я уверен, что это нельзя относить к "разным результатам в разных БД", ибо налицо явный баг и Оракл его как пить дать исправит. Ибо с своей трактовке ON-предиката он чудовищно одинок в толпе прочих СУБД :-)

vadiminfoПричем тут оптимизатор? Его дело выбрать лучший алгоритм выполни запроса. Т.е. он отвечает за то как извлечь лучше. А мы говорим про то что нужно извлечь.

Шаг влево/вправо в оптимизаторе чреват другими результатами запроса. По-моему, это очевидно.

protectorВ Оракуле всё в порядке с джойнами, только с оракловыми, а с явными что-то не то.

Именно. Причем сильно не то. Особенно с внешними.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32766248
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoИнтуитивно то так. Но более формально, JOIN операция соединения, а ON условие на соединение.
Более формально, SQL - язык, предназначенный для ухода от операций. Он декларативен, он описывает результат, а не операции, необходимые для его достижения.

Именно поэтому мне не нравится синтаксис join-ов; он нарушает базовую идею.

P.S. Из веселого - в Oracle Warehouse Builder разрешен синтаксис full outer join через (+). Там парсер отлавливает эту ситуацию и автоматически конвертирует в явный join.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32766266
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПричем тут оптимизатор? Его дело выбрать лучший алгоритм выполни запроса.
Т.е. он отвечает за то как извлечь лучше. А мы говорим про то что нужно извлечь.
Такой результат как у Вас можно извлечь в Оракле, но классическими для соединений условиями - явное указание столбцов, по которым должно быть соединение, наприер
select * from dual d1 left join dual d2 on d1.dummy = d2.dummy || d2.dummy

вернет

dummy dummy
Х -

Но вопрос до конца не ясен. Нужно понять достоинство и недостатки того как работают условия выборки в условии на сединение.
В ASA для оптимизатора условие в ON - это условие на соединение, условие в WHERE - условие на фильтрацию результата соединения. Что будет стоять в том или этом условии ему до лампочки, хоть константа, хоть соединения полей других таблиц. А оптимизатор очень даже при чем - я то пишу условие как мне удобней писать, а уже при выполнении запроса, если посмотреть его план не факт, что оптимизатор не изменит соединения таблиц, выкинет лишние таблицы и условия или даже их переделает (упросит булевые соединения скобок AND и OR или перегруппирует их, если возможно без потери смысла). Например, только вчера у меня в запросе такого плана:
Код: plaintext
1.
2.
3.
SELECT *
FROM Table1 t1
  INNER JOIN Table2 t2 ON t1.id = t2.id AND t2.flag2 =  1 
WHERE t1.flag1 =  1 
я увидел в плане запроса соединение таблиц:
Код: plaintext
t1.id = t2.id AND t1.flag1 = t2.flag2
это при том, что flag1 никакого отношения к flag2 то собственно говоря не имеет. Я страшно удивился, но вроде все как выходило в данном случае верно - по текущему плану запросов ему было легче соединять column-to-column используя статистику, тем более что у обоих был тип bit, чем накладывать на каждую таблицу предикат сравнения флага с единичкой. Взял и поменял условие flag2 = 0 и он тут же в плане запросов разложил все на предикаты по таблицам. Вот так вот - а я то уж грешным делом посмотрев на план запроса подумал, что уже проглючиваю и в запросах поля разной смысловой нагрузки соединяю :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32766680
DimaR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TO vadiminfo

Вот то, что нет в Оракле рекурсивных запросов, пока мне не ясно. Что это значит? Появятся они или нет?

Если имеется в виду синтаксис with, то он уже давно есть, начиная с 9i.

отличается ли он смыслом от DB2 или sybase, не знаю, может кто раскажет?
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32766717
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaR
Вот то, что нет в Оракле рекурсивных запросов, пока мне не ясно. Что это значит? Появятся они или нет?

Если имеется в виду синтаксис with, то он уже давно есть, начиная с 9i.

отличается ли он смыслом от DB2 или sybase, не знаю, может кто раскажет?

Синтаксис with в 9i к рекурсиям пока не имеет отношения. Надно что-то типа with recurcive. А ситаксис with в Оракле позволяет реализовать что-то типа отделения описания подзапросов и вызова в запросе оп имени определенному в предложении with. Т.е. если один подзапрос встречается много раз в запросе, то можно в with его описать, а потом вставлять имена пордзапроса. Т.е. пока это просто даленьешие средства структуризации запроса, а не управление чем-либо типа рекурсии.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32766817
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr
Интуиция вместе с формальной реляционной алгеброй отдыхают, ибо есть спецификация SQL. И там четко описан смысл конструкции ON во внешних джойнах. Ограничение на обязательность столбцов там отсутствует.

Им еще рано уходить на отдых, пусть работают. А вот спецификацию я пока не нашел. Ограничение то отсутствует, иначе бы ругалось. А вот как понимать условие на соединение, если нет про описание про то по каким столбцам должно происходить соединение? Это другое.

dimitr
Условие соединения уходит в ON, а фильтр на результат - в WHERE. И никакая самодеятельность со стороны сервера тут недопустима.


Уходит то оно уходит. Вопрс как уходит. И почему самодеятельность сервера? Возможно, так и задумано. Мы же еще не нашли реальных аргументов в пользу того или другого. Пока интуиция работает.



dimitr
Но я уверен, что это нельзя относить к "разным результатам в разных БД", ибо налицо явный баг и Оракл его как пить дать исправит. Ибо с своей трактовке ON-предиката он чудовищно одинок в толпе прочих СУБД :-)



Если уверенность основана на том что это баг, то она, возможно, преждевременна. Я проверял и на других запросах. Везде работает так же, а в доке ничего нет по данному вопросу. Баг - если результат не тот, что должен быть в доке. А так пока не ясно баг это или нет. А я и в книгах копал. Пока не нашел прояснений.
То что Оракл будет подгонять тоже не ясно. Ведь тогда могут перестать работать уже написанные по старому запросы, в разработанных системах.
dimitr
Шаг влево/вправо в оптимизаторе чреват другими результатами запроса. По-моему, это очевидно.

При чем тут шаги в оптимизаторе? Его дело оптимизировать. Он может вообще переписать запрос по другому, но чтобы тот возвращал, то что есть в исходном запросе. Это уже вопросы реализации запроса.
Мы же не оптимизаторы сравниваем, а сами запросы.


softwarer
Более формально, SQL - язык, предназначенный для ухода от операций. Он декларативен, он описывает результат, а не операции, необходимые для его достижения.


Все-таки SQL - язык БД и предназначен для реализации модели данных, в том числе и рел алгебры. Для ухода от операций предназначены исчисления доменов или кортежей. Декларативность лишь означает, что нет алгоритмических процедур для реализации операций, а просто описываются алгебраические операции, например, соединение. Т.е. он описывает алгебраические операции (а не процедуры и алгоритмы на процедурном языке), которые нужно выполнить, чтобы получить результат. А СУБД их выполняет. И если Вы пишите (+), то Вы предполагаете, что алгебраическая операция "внешнее соединение" ассоциативна, т.е. не зависит от порядка выполнения, а не уход от от этой операции. А всегда она ассоциативна? В JOIN есть возможность явно задать порядок соединений.

2 ASCRUS
Для анализа запроса, его оптимизации - оптимизация и план выполнения запроса нужны. Чтобы понять как поняла СУБД и как его улучшить. Но когда мы пишем запрос, мы в праве ничего не знать о деталях реализации. Т.е. мы без оптимизатора должны знать что должен вернуть запрос. Другое дело если мы начнем сравнивать сами оптимизаторы в наших СУБД.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32766913
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo
Не соглашусь. С моей точки зрения, когда я пишу a.id = b.id, я накладываю некоторое ограничение на результирующую выборку - то есть из картезиана исходных данных оставляю только те, которые соответствуют некоторому условию. Само условие может быть любым, в том числе достаточно сложным.
А вот то, что сервер решает выполнить соединение этих таблиц - это уже "алгоритм реализации". С тем же успехом он может именно что составить картезиан и отфильтровать - это его дело. А может - как, например, делает Oracle - вообще подставить в это условие более подходящую таблицу.

Мне - это неважно. Мне важно, что я получил результат, совпадающий со спецификацией.

Впрочем, это как всегда - вопрос терминологии, вопрос "где провести границу".
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32767426
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понял, о чем флуд, если в Oracle 9.2.0.5 по крайней мере я увидел вот что:

SQL> select * from dual d1 left join dual d2 on 1 = 0;

D D
- -
X

Багов в Оракле конечно хватает, но данный конкретный видимо поправили :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32767511
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex.Czech
в Oracle 9.2.0.5 по крайней мере я увидел вот что:

SQL> select * from dual d1 left join dual d2 on 1 = 0;

D D
- -
X


Значит все-таки то был баг в 9.2.0.1.0. Там на самом деле есть еще гадский баг с FULL JOIN. Вообще отпадает на нем серверный процесс. Причем коварно, до определенной сложности запроса все нормально, добавил order by и обрыв коммуникаций. В 9.2.0.5 говорят нет уже.




автор
С моей точки зрения, когда я пишу a.id = b.id, я накладываю некоторое ограничение на результирующую выборку - то есть из картезиана исходных данных оставляю только те, которые соответствуют некоторому условию. Само условие может быть любым, в том числе достаточно сложным.



Но это значит, что Вы выполнили последовательно две операции рел алгебры картезиан - декартово соединение и выбора. Но есть и различные другие виды соединений в алгебре. И ими легче мыслить, а потом реализовать на SQL. Одна операция вместо двух: соединение вместо картезиана и выборки. В этом может быть еще больше декларативности, потому что не надо разбивать на две операции и кроме того, это уже похоже на алгоритм выполнения соединения. Т.е. получается вопрос о сводимости соединений к картезиану и выборки, и о том охота ли сводить, когда можно строго прописать само соединение. Тем более когда участвует много таблов в соединении там может играть роль и порядок соединений.
Так или иначе должен быть выбор явный JOIN или нестандартные (+).
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32767680
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С FULL OUTER JOIN там вообще багов хватает, в т.ч. и в 9.2.0.5, мягко говоря... я портировал с MS SQL, я знаю :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32768147
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoНо это значит, что Вы выполнили последовательно две операции рел алгебры картезиан - декартово соединение и выбора.
Нет. Это значит, что я продекларировал ограничение. А уж сервер выберет, какими операциями его реализовывать.

P.S. Имхо мы ходим по кругу в споре о вкусах.

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

vadiminfoТак или иначе должен быть выбор явный JOIN или нестандартные (+).
Хм. Скажем так, для опытного разработчика, безусловно, лучше наличие обеих фич и возможность выбора. Но при гипотетическом выборе между диалектом, поддерживающим только LEFT|RIGHT JOIN и диалектом, поддерживающим только (+), лично я бы предпочел второй.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32769483
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Нет. Это значит, что я продекларировал ограничение. А уж сервер выберет, какими операциями его реализовывать.

Если Вы в лоб пишете: "выполнить алгебраическую операцию из реляционной алгебры - соединение", то Вы находитесь в пределах модели. Это дальше от копм структур, алгоритмов. Это просто математика. До алгоритмов еще далеко. А ограничения продекларированные это больше связано с констрэйнами. Кортезиан и выборка это из той же рел алгебры. Другие операции. Т.е. соединение = кортезиан * выборка. Последовательное выполнение алгебраич операций. Ближе к алгоритмам - уже два шага. Мне так кажется)



softwarer
Вот последнее, полагаю, и является ключевым. Вам легче мыслить, потому что это ближе к алгоритму, к выполнению. Я понимаю такую точку зрения :) Но имхо - это дальше от идеи SQL.


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



softwarer
Хм. Скажем так, для опытного разработчика, безусловно, лучше наличие обеих фич и возможность выбора. Но при гипотетическом выборе между диалектом, поддерживающим только LEFT|RIGHT JOIN и диалектом, поддерживающим только (+), лично я бы предпочел второй.



Ну, лучше обе фитчи раз есть разные мнения - вкусы, как Вы сказали.
Я естественно, выбрал бы явные FULL|LEFT|RIGHT JOIN, CROSS JOIN, NATURAL JOIN только из-за того, чтобы явно было написано какие именно оп6ерации рел алгебры должны быть использованы чтобы получить результат. Это просто улучшает стиль, читаемость. Проще потом сопровождать. Это не говоря уже о тех недостатках (+), что Оракл прописал, ну из литератры по БД.


Вот мысли Оракла:
Oracle Corporation recommends that you use the FROM clause OUTER JOIN syntax rather than the Oracle join operator. Outer join queries that use the Oracle join operator (+) are subject to the following rules and restrictions, which do not apply to the FROM clause join syntax:

You cannot specify the (+) operator in a query block that also contains FROM clause join syntax.
The (+) operator can appear only in the WHERE clause or, in the context of left-correlation (that is, when specifying the TABLE clause) in the FROM clause, and can be applied only to a column of a table or view.
If A and B are joined by multiple join conditions, then you must use the (+) operator in all of these conditions. If you do not, then Oracle will return only the rows resulting from a simple join, but without a warning or error to advise you that you do not have the results of an outer join.
The (+) operator does not produce an outer join if you specify one table in the outer query and the other table in an inner query.
You cannot use the (+) operator to outer-join a table to itself, although self joins are valid.

Вот я Вам рекомендую их пробовать. Я теперь на (+) и смотреть даже не могу. Это как с 98 на 2000 винды перейти.
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32771593
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запросы с *= в MS SQL в некоторых (нечастых, но встречающихся в жизни) ситуациях выдают непредсказуемые результаты - причем это не ошибка оптимизатора, а именно неоднозначность описания порядка джойнов.

Лично мне одного такого случая хватило, чтобы эту штукень больше никогда в жизни не юзать. Есть ли такое в Оракле, нет ли - не знаю, не пробовал :)
...
Рейтинг: 0 / 0
А зачем нужен этот монстр....... MS SQL?
    #32772368
Shweik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex.CzechЗапросы с *= в MS SQL в некоторых (нечастых, но встречающихся в жизни) ситуациях выдают непредсказуемые результаты - причем это не ошибка оптимизатора, а именно неоднозначность описания порядка джойнов.

Лично мне одного такого случая хватило, чтобы эту штукень больше никогда в жизни не юзать. Есть ли такое в Оракле, нет ли - не знаю, не пробовал :)
Если не сильно влом - кинь плиз примерчик. Интересно
что ты теперь юзаешь.
...
Рейтинг: 0 / 0
403 сообщений из 403, показаны все 17 страниц
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / А зачем нужен этот монстр....... MS SQL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]