Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 16 17 18 19 20 21 [22] 23 24 25   вперед  Ctrl
 Re: Нужна помощь  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Gluk (Kazan)

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

я именно был уверен. по-моему, я уже написал, что ничем не могу подтвердить.
полагаю, источником моей уверенности был авторитет человека, написавшего об этом на форуме + неверное (не исключаю) истолкование его слов мною.
28 май 09, 14:56    [7240026]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

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

Для меня вся Ваша позиция остается загадкой. Например, мне непонятно, что Вы понимаете под "реакцией СУБД на неправтльные действия", что называете "неправильными действиями" и в чем-же собственно состоит Ваша "прозрачная позиция".
В этом топике Вы появились (если я не ошибаюсь - может быть более ранние реплики пропустил) со следующим саркастическим утверждением:
Владимир Смирнов
Вас не смущает наличие разных инструкций INSERT, UPDATE, DELETE? У них действия различны. Да ещё и разный синтаксис.
Может потребовать оставить только что-то одно? Ну, для соблюдения "единства концепций".

Сделать какой-либо вывод о вашей позиции кроме того, что Вы со мной в чем-то не согласны - не могу.
Давайте попробуем конкретно.
1. Считаете ли Вы, что при любой ошибке в процессе исполнения вся транзакий должна быть откачена?
2. Считаете ли вы использование операторов управления транзакциями в триггерах является хорошим/плохим, допустимым/недопустимым.
3. Считаете ли Вы, что использование единых концепций и правил программирования в рамках одного проекта является порочной практикой.
28 май 09, 15:09    [7240146]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Зайцев Фёдор
Gluk (Kazan)

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

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


А проверить религия не позволяет ?
Мне вот под Oracle не трудно, а MS SQL-я под рукой нет
28 май 09, 15:15    [7240194]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Gluk (Kazan)
А проверить религия не позволяет ?
Мне вот под Oracle не трудно, а MS SQL-я под рукой нет

Обязательно проверю, но не раньше, чем мне действительно потребуется savepoint
28 май 09, 15:32    [7240348]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Владимир Смирнов
Member

Откуда: Северодвинск
Сообщений: 136
Bogdanov Andrey
мне непонятно, что Вы понимаете под "реакцией СУБД на неправтльные действия", что называете "неправильными действиями"

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

Bogdanov Andrey
и в чем-же собственно состоит Ваша "прозрачная позиция".

Именно в раннее сказанном. Неправильные действия (операция, транзакция) должны быть отменены (завершены отменой).

Bogdanov Andrey
В этом топике Вы появились (если я не ошибаюсь - может быть более ранние реплики пропустил) со следующим саркастическим утверждением:
Владимир Смирнов
Вас не смущает наличие разных инструкций INSERT, UPDATE, DELETE? У них действия различны. Да ещё и разный синтаксис.
Может потребовать оставить только что-то одно? Ну, для соблюдения "единства концепций".

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

Это моё сообщение было реакцией не на Вашу позицию, которая, как я понял, допускает "разумные" нарушения правил, а на упорство, с которым Вы свою позицию отстаиваете. Под видом "единства концепций".

Bogdanov Andrey

Давайте попробуем конкретно.

Пожалуйста.

Bogdanov Andrey

1. Считаете ли Вы, что при любой ошибке в процессе исполнения вся транзакий должна быть откачена?

"Любой" - слишком обширно, потому ответ - "нет, не считаю".
Bogdanov Andrey

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

Допустимым, и даже необходимым. Это "последняя линия защиты".

Bogdanov Andrey

3. Считаете ли Вы, что использование единых концепций и правил программирования в рамках одного проекта является порочной практикой.

Зависит от концепции и правил. Если концепция (или правило) неудачная, а тем более ошибочная (как, например, неуникальность ПК), то вреда от неё неисчислимо больше, чем отсутствие вообще какой бы то ни было концепции.
28 май 09, 15:50    [7240473]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
softwarer
А вот rollback в триггере в такой роли... не ложится в разумную концепцию вообще, лично для меня.

Ну, NO_DATA_FOUND оно как бы тоже в разумную конецепцию ложится весьма слабо :)
но тем не менее.
28 май 09, 16:19    [7240738]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Владимир Смирнов
Member

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


А ещё более классический пример, описанный более 500 лет назад неким Лукой Пачоли. Так там вообще операция перевода между счетами записывается одной записью. Вот уж где обеспечение целостности. Баланс в принципе всегда сходится.
28 май 09, 16:22    [7240762]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
автор
Bogdanov Andrey

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

Допустимым, и даже необходимым. Это "последняя линия защиты".

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

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

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

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

Как видите, правило роллбэк снаружи является более универсальным и подходит для обоих типов проектов
28 май 09, 16:44    [7240944]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Владимир Смирнов
Member

Откуда: Северодвинск
Сообщений: 136
martin_bishop
автор
Bogdanov Andrey

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

Допустимым, и даже необходимым. Это "последняя линия защиты".

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

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

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

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

Как видите, правило роллбэк снаружи является более универсальным и подходит для обоих типов проектов


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

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

А по поводу "роллбэка снаружи". Вот некто внёс изменения в таблицу. Новые данные противоречат правилу. Но они уже в таблице. Сработал триггер. Обнаружил недопустимость таких данных. Как гарантированно отменить эти изменения и не допустить неправильные данные после завершения выполнения транзакции?
28 май 09, 17:14    [7241109]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Владимир Смирнов
Как гарантированно отменить эти изменения и не допустить неправильные данные после завершения выполнения транзакции?


Просто поместите инсёрт внутрь транзакции ...
28 май 09, 17:19    [7241144]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
И действия триггера тоже осстанутся внутри.
28 май 09, 17:21    [7241157]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
martin_bishop
И действия триггера тоже осстанутся внутри.
и какие это будут действия?
28 май 09, 17:27    [7241196]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
Владимир Смирнов
Именно в раннее сказанном. Неправильные действия (операция, транзакция) должны быть отменены (завершены отменой).
Должно быть отменено только неправильные действие или весь ряд действий им предшествующих?
Если только одно действие, то это именно то, что Oracle называет атомарностью операций и неукослонно этому следует. Я правильно понимаю, что принцип "атомарности операций" в MSSQL не выполняется?

Владимир Смирнов
Bogdanov Andrey

1. Считаете ли Вы, что при любой ошибке в процессе исполнения вся транзакий должна быть откачена?

"Любой" - слишком обширно, потому ответ - "нет, не считаю".

Хорошо, здесь наши позиции совпадают.

Владимир Смирнов
Bogdanov Andrey

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

Допустимым, и даже необходимым. Это "последняя линия защиты".

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

Владимир Смирнов
Bogdanov Andrey

3. Считаете ли Вы, что использование единых концепций и правил программирования в рамках одного проекта является порочной практикой.

Зависит от концепции и правил. Если концепция (или правило) неудачная, а тем более ошибочная (как, например, неуникальность ПК), то вреда от неё неисчислимо больше, чем отсутствие вообще какой бы то ни было концепции.

Ага, вот и наметилась точка расхождения. Я считаю, что отсутствие каких-либо концепций значительно хуже любых концепций. Хотя, возможно, что мне просто не хватает фантазии для того, чтобы придумать настолько "неудачные" концепции. Ну разве только использование rollback в тригерах :)
28 май 09, 17:28    [7241207]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
Bogdanov Andrey
Владимир Смирнов
Именно в раннее сказанном. Неправильные действия (операция, транзакция) должны быть отменены (завершены отменой).
Должно быть отменено только неправильные действие или весь ряд действий им предшествующих?
Если только одно действие, то это именно то, что Oracle называет атомарностью операций и неукослонно этому следует. Я правильно понимаю, что принцип "атомарности операций" в MSSQL не выполняется?

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

Вы также понимаете что такое атомарность? Если да - что из этого в MSSQL не выполняется?
28 май 09, 17:43    [7241297]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
SergSuper
martin_bishop
И действия триггера тоже осстанутся внутри.
и какие это будут действия?


Всё что успел наделать триггер, но подлежит откату. Я имел ввиду это.

автор
По всей видимости в MSSQL они нужны из-за отсутствия возможности сделать exception в триггере
Почему же? raiserror прекрасно выполнял(ет) эту ф-цию.
Вот пример с эксэпшин и роллбэком снаружи, но неминуемо, если ошибка.

use tempdb
GO
create table T1 (i int)
create table T2 (i int)
GO
create trigger TR_T1 on T1 for insert as
begin
	insert T2 (i) select i*i from inserted
	raiserror ('Test error', 16, 1)
end
GO
truncate table T1
truncate table T2

insert T2 (i) select -1

begin tran
insert T1 (i) select 8
if @@error = 0 commit tran
else rollback tran

select * from T1
select * from T2

GO
drop table T1
drop  table T2
28 май 09, 17:44    [7241308]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
SergSuper
Вы также понимаете что такое атомарность? Если да - что из этого в MSSQL не выполняется?
Никто не ставит под сомнение выполнение ACID в случае роллбэка в триггере.

Но утверждается, что роллбэк снаружи триггера и необязательный откат при любой ошибке нижнего слоя (триггера, например) тоже не нарушает ACID
28 май 09, 17:52    [7241356]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Вернее перефразирую:

Но утверждается,
что можно построить систему при роллбэке снаружи триггера и необязательным откат при любой ошибке нижнего слоя (триггера, например), которая тоже не нарушает ACID
28 май 09, 18:01    [7241410]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
А то не дай бог подумаете, что любая система с роллбэком наружу не противоречит FCID
28 май 09, 18:03    [7241420]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
SergSuper

Если только одно действие, то это именно то, что Oracle называет атомарностью операций и неукослонно этому следует. Я правильно понимаю, что принцип "атомарности операций" в MSSQL не выполняется?

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

Вы также понимаете что такое атомарность? Если да - что из этого в MSSQL не выполняется?[/quot]Вы заметили, что я пишу об "атомарности операций", не об "атомарности транзакций". Допускаю, что Вам термин "атомарность операции" не знаком. В таком случае поясню, что я под ним понимаю.
Атомарность операции означает, что все действия, выполняемые "внутри" операции (если говорить о DML, то это не только модификация записей, затрагиваемых DML, но также и все действия выполняемые в триггерах и т..п) либо все вместе выполняются, либо все вместе не выполняются. Таким образом, если операция завершилась с ошибкой, то база данных будет в точности в том состоянии, в каком была перед выполнением операции.
В Oracle декларируется атомарность DML-операторов. Есть некоторые оговорки (например, использование автономных транзакций), но обеспечение атомарности выполняется СУБД автоматически и от программиста скорее требуется приложить усилия, чтобы ее нарушить.
28 май 09, 18:13    [7241459]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
martin_bishop
Вот пример с эксэпшин и роллбэком снаружи, но неминуемо, если ошибка.
Отлично, что Вы этот пример привели. Он как раз иллюстрирует написанное об атомарности транзакций. Если в вашем примере, я напишу, просто (без rollback, хотя commit можно оставить)
insert T1 (i) select 8

select * from T1
select * from T2
то, что я получу?
Oracle в аналогичной ситуации покажет отсутствие записей в обоих таблицах, а MSSQL?
28 май 09, 18:20    [7241486]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
To Bogdanov Andrey:
Я не совсем понял вопрос.

Если в моём примере закомментить строку с роллбэк, то селекты покажут строчки.
Ведь мы пока внутри транзакции. А raiserror - здесь это генерация логической ошибки, т.к. вставка просто целого числа в таблу ничему не противоречит
В приводимых оппонентами примерах отрицательный остаток это тоже ведь логическая ошибка (с точки зрения таблицы, отрицательное - такое же целое)

Но если среагировать на ошибку, то строчки исчезнут
28 май 09, 18:42    [7241565]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
martin_bishop
Я не совсем понял вопрос.

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

martin_bishop
Если в моём примере закомментить строку с роллбэк, то селекты покажут строчки.
Вот тут-то собака и зарылась. Как я уже отметил, если в Oracle выполнение SQL-оператора завершилось с ошибкой, то состояние базы автоматически возвращается к моменту перед началом выполнения оператора. То есть либо ошибка, либо изменение данных. И то и другое одновременно - невозможно. Соответственно, выполнение ошибочного оператора в принципе невозможно, как бы пользователи базы не исхищрялись.
28 май 09, 18:49    [7241585]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Выполнение ошибочного - да.

Но я искусственно делаю raierror. С точки зрения базы - ошибки нет.
Только с точки зрения бизнес логики
28 май 09, 19:03    [7241625]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
И я не оставляю мою "искусственную" ошибку без внимания:
если была, то откатываю транзакцию (только снаружи триггера)
28 май 09, 19:05    [7241627]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
martin_bishop
И я не оставляю мою "искусственную" ошибку без внимания:
если была, то откатываю транзакцию (только снаружи триггера)

Да, я понимаю. Еще раз сошлюсь на Oracle - в нем происхождение ошибки не имеет значения - "искусственные" имеют ту же значимость, что и "естественные". Это как раз и есть реализация моей "любимой" инкапсуляции - код, вызывающий DML-оператор никак не зависит от способа реализации ограничения - что декларативное, что триггерное ограничения снаружи "выглядят" одинаково (при желании, конечно, можно причину ошибки проанализировать).
28 май 09, 19:29    [7241678]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 16 17 18 19 20 21 [22] 23 24 25   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить