Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8 9 10 .. 17   вперед  Ctrl
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
MasterZiv
Member

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

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

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

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

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

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

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

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

MasterZiv

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


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

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

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

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


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

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

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

Это как это ? После окончания своей эксплуатации она еще жить должна ? Зачем ? Все, эксплуатации-то нет.
6 окт 04, 13:29    [1012472]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
ASCRUS
Member

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

На ХП же у меня реализована сложная логика сохранения изменения информации (которая именно решает, что и куда писать, а уж проверяют триггера). Плюс весь расчет зарплаты и отчетности, естественно на таблицах, хранящих результаты расчетов никаких уже триггеров (да и ограничений) нет, тут правила хранения в них информации четко реализуют расчетные ХП и одним из главных показателей работы с ними является скорость чтения/записи в них.
6 окт 04, 14:02    [1012711]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
vadiminfo
Member

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>Это как это ? После окончания своей эксплуатации она еще жить должна ? Зачем ? Все, эксплуатации-то нет.
В силу ценности данных самих по себе. Даже существует юридическая защита БД самих по себе, не в связи с остальной частью ИС. Тем более, и Вы выше упомянули, что БД нет дела до прог, которые с ней работают, т.е. они имеют собственную ценность. Их можно использовать с помощью других прог для извлечения информации. А зачем - это уже дело потребителей инфы. Важно, что это одно из достоинств БД.
6 окт 04, 15:20    [1013184]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
MasterZiv
Member

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


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


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


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


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


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

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

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

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

Их можно использовать с помощью других прог для извлечения информации. А зачем - это уже дело потребителей инфы.
Это и есть эксплуатация, или я что-то не понимаю ?
6 окт 04, 20:20    [1014291]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
vadiminfo
Member

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

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

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

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

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


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

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


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

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


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

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

Если и эксплуатация то только БД, а не ИС ядром, которой она была в свое время. Т.е. все другие эленменты, в общем случае включая СУБД не имеют значения. Формально достаточно, что кто-то может использовать эти данные для принятия решения даже однократно. А может в другой ИС, но с той же СУБД не важно.
6 окт 04, 22:25    [1014392]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
c127
Guest
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 раза меньше. Или я чего-то не понял?
7 окт 04, 03:15    [1014502]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
s79
Member

Откуда: Владивосток
Сообщений: 40
MasterZiv

!! ... аудита НЕУДАЧНЫХ попыток изменить данные ...!!!
Ну и как делали ?

И не надо так орать:). для Oracle решение это: триггеры на строку(для детальности) и автономные транзакции (pragma autonomous_transaction) . Собственно рецепт: Т.Кайт. "Автономные транзакции
Oracle поддерживает INSTREAD OF
7 окт 04, 04:12    [1014515]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
Уважаемые! Ответьте пожалуйста на один вопрос - что такое целостность, ссылочная целостность, декларативная целостность? И чем все эти понятия отличаются от согласованности? Мне кажется между этими двумя терминами - целостность и согласованность - огромная разница. Целостность реализуется через FK/PK. Согласованность - гораздо более емко понятие. Реализуется триггрерами и check constraint. И в этом отношении SQL в Sybase ASE, MS SQL очень сильно уступает Oracle, DB2, Sybase ASA, PosgreSQL и куче других баз.
7 окт 04, 09:45    [1014842]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
Yo!
Guest
автор

Если не ошибаюсь, ты сказал, что на пхп получится не в 3 раза больше, а в 3 раза меньше. Или я чего-то не понял?


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


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


а язык он не на размер кода заточен, а на задачи. такое впечатление что ты про перл ничего не слышал. на нем решение любой задачи будет занимать меньше кода, там просто там одна проблемка write fast, read slow.
7 окт 04, 11:47    [1015358]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
2MasterZiv
Неудачных попыток? т.е тогда, когда в триггере идет rollback?
давайте попробуем представить...
MS SQL 2000
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

7 окт 04, 11:49    [1015364]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Еще можно вынести в отдельную БД, подключить ее через удаленный сервер и сделать соотвествующие в ней ХП. Так же события помогают (если они есть конечно) - вызываешь событие из триггера, далее оно уже в своей сессии работает и никому не мешается.
7 окт 04, 12:14    [1015480]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
2 locky
В MS SQL стандартными способами это сделать нельзя - триггер прерывается после ролбэка
7 окт 04, 12:26    [1015547]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
locky
2MasterZiv
Неудачных попыток? т.е тогда, когда в триггере идет rollback?
давайте попробуем представить...
MS SQL 2000
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


Честно говоря я х..ею от такого кода...
вопрос, а что было с данными, которые изменились до выполнения триггера?
7 окт 04, 12:39    [1015611]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709
Конечно, не понимаю чем они сложнее.

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

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

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

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

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


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

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

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

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

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

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

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

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

В другой, не в другой, с, без - это эксплуатация по любому.
7 окт 04, 12:39    [1015613]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709
s79

И не надо так орать:).

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

s79

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


Ну я и говорил, что без использования спец. системных средств или возможностей СУБД это невозможно.
7 окт 04, 12:42    [1015636]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
>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

7 окт 04, 12:46    [1015653]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709
gardenman
Уважаемые! Ответьте пожалуйста на один вопрос - что такое целостность, ссылочная целостность, декларативная целостность?

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

gardenman

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

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

gardenman

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


gardenman

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


Биз базаров, Оракул и Посгрес рулят, асобинна Посгрис.
Эта ващще зверь !!
7 окт 04, 12:50    [1015675]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709
locky
давайте попробуем представить...
MS SQL 2000
create trigger au on authors for update

Ты эта запускать пробывал ? Работаить ?
7 окт 04, 12:53    [1015689]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
>Ты эта запускать пробывал ? Работаить ?
А поглядеть (почитать) религия не позволяет?
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

7 окт 04, 13:04    [1015759]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4802
В транзакции они работают ? Не в транзакции не могут ?
Правила откатывания/принятия транзакций есть ?
Надо это все прописывать ?


В Оракле, как правило, необходимость управлять транзакциями если и возникает (редко встречалась необходимость), то не вызывает таких сложностей, чтобы о оних говорили. Сам не встречал сложностей ни в практике, ни упоминая о них литре по Ораклу. Что-то читал, что вроде в других СУБД посложнее с этим. Т.е. больше вопрос реализации механизма транзакций и поддержки в СУБД, а не концепции самого триггера.. Хорошо, скажем так – отменяйте их, но не в Оракле. С другой стороны не факт, что никогда не надо управлять транзакциями в ХП. Проект с процедурами вместо 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, но они не учли. Но кто знает.

>В другой, не в другой, с, без - это эксплуатация по любому.
Ну, пусть будетэксплуатация БД после окончания жизненного цикла ИС.
7 окт 04, 16:18    [1016579]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
просто в очередной раз большой респект
ASCRUS за https://www.sql.ru/forum/actualpost.aspx?bid=10&tid=7615&mid=0&p=5#1012711
и
gardenman за https://www.sql.ru/forum/actualpost.aspx?bid=10&tid=7615&mid=0&p=5#1014842

imho как раз верные выщи - а не пустая болтовня
7 окт 04, 16:25    [1016615]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
позволю себе еще одно замечание.
ROLLBACK в триггере считаю дурным тоном.
Триггер должен либо выполниться, либо не выполниться, либо вернуть ошибку RASE_ERROR. Триггер - это всего лишь подпрограмма и она может быть вызвана откуда угодно. И решение о том откатывать транзакцию или нет должен принимать caller - вызвавшая процедура.
Когда я в Sybase - овской документации увидел такой пример, для меня на счет Sybase сразу все понятно стало - ламеры..)))
7 окт 04, 17:27    [1016907]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
Может не до конца понял gardenman но какое такое решение может принять caller если тригер, контролирующий согласованность, считает ситуацию недопустимой?
7 окт 04, 17:48    [1016991]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
автор
Когда я в Sybase - овской документации увидел такой пример, для меня на счет Sybase сразу все понятно стало - ламеры..)))

Смотря в каком Sybase. В отличие от ASE, в ASA можно просто в триггере сгенерить ошибку через RAISERROR, возбудить исключение через SIGNAL, сделать откат до сохраненной точки через ROLLBACK TO SAVEPOINT или выполнить откат через оператор ROLLBACK TRIGGER, который позволяет реализовать обработку ошибок вложенных триггеров, что в вкупе с поддержкой обработки исключений дает прекрасную возможность гибко реализовывать любую логику работы.
7 окт 04, 18:01    [1017024]     Ответить | Цитировать Сообщить модератору
 Re: А зачем нужен этот монстр....... MS SQL?  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4802
gardenman

Уважаемые! Ответьте пожалуйста на один вопрос - что такое целостность, ссылочная целостность, декларативная целостность? И чем все эти понятия отличаются от согласованности? Мне кажется между этими двумя терминами - целостность и согласованность - огромная разница. Целостность реализуется через FK/PK. Согласованность - гораздо более емко понятие. Реализуется триггрерами и check constraint.


Но есть и другая правда. В литературе по БД целостность - удовлетворение данных логическим правилам. Ограничения целостности в (зависимости от литературы): Ограничения уникальности, Ссылочной целостности, Ограничения на значения и Ограничения общего вида - связаны с логической моделью данных. Декларативные - это те, которые могут быть объявлены в схеме как органичения данного вида в данной СУБД. Например, check constraint - ограничение на значение, объявляется явно и поддерживается СУБД. В том числе в словаре БД можно искать декларативные - т.е. они явно описывают модель. И уж точно для их реализации ничего не надо программировать на процедурном (алгоритмическом языке). Однако, поскольку не всегда декларативных возможностей хватает для реализации необходимых ограничений, используются пользовательские (триггерные). Могут быть разные названия в разных источниках. Тогда используется процедурный язык. Т.е. языка БД уже не достаточно. Такие органичения целостности - хуже читаются (модель становится менее читаемой) , поэтому, конечно, декларативные предпочтительнее во всех отношениях, чем триггерные. Другое дело все ли ограничения целостности могут быть выражены с помощью декларативных ограничений? Нет ли другой пользы от возможности запуска процедур на события связанные с изменением состояний БД?
Согласованность данных больше встречается в контексте физических процессов по переходу БД из одного состояния в другое. Транзакция состоит из нескольких операций. Каждая операция внутри транзакции может переводить БД в несогласованное состояние, но транзакция в целом не должна.
Часть данных изменила, а другую не изменила - можно говорить о несогласованности данных. Продолжают они удовлетворять ограничениям целостности или нет - БД не должна находиться в таком состоянии. Кроме того, во время изменнения данных, кто-то другой читает их, и в общем случае может прочитать промежуточные - несогласованные данные.
7 окт 04, 19:45    [1017315]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8 9 10 .. 17   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить