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

Откуда:
Сообщений: 82
pkarklin
Самое простое, то выкинуть все триггера из всех таблиц, и вынести обрабоку на "верхний слой"


Или превратить триггеры в эксэпшины (с)
27 май 09, 17:46    [7236411]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
martin_bishop
pkarklin
Самое простое, то выкинуть все триггера из всех таблиц, и вынести обрабоку на "верхний слой"


Или превратить триггеры в эксэпшины (с)


Гм... И чем это поможет, если "верхний слой" не будет иметь их обработки?
27 май 09, 17:48    [7236422]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Т.е. забрать у них право роллбэчить. Только уведомлять
27 май 09, 17:48    [7236424]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
martin_bishop
locky

martin_bishop

Подчёркиваю: и первый и второй вариант не даст нарушить целостность.
Но с виду одинаковый скрипт ведёт себя по-разному.

Правильно ли это?

Формально говоря - правильно.
Не вижу аргументов почему?

Моя концепция следующая:
Одна и та же смысловая единица кода (в данном случае инсёрт) должна реагировать одинаково на логически одинаковое событие.
В данном случае логически одинаковое событие - это попытка воткнуть "плохую" строку.


Потому что формально - это две разных БД с РАЗНОЙ структурой.
Не вижу причины, по которой две разные БД с разной структурой обязаны вести себя одинаково.
27 май 09, 17:49    [7236428]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Если мы ведь говорим не о самом "верхнем". а о только "сразу над" слое, то этот "над" пусть и тыкается во вторую-третью.
А потом эскалирует полное не смог ещё выше. своему мастеру
27 май 09, 17:50    [7236437]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
locky
Потому что формально - это две разных БД с РАЗНОЙ структурой.


Почему же разная?

В базе с триггерами наверняка есть и чеки и форэин ключи ...
27 май 09, 17:52    [7236448]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Или в базе с триггерами принудительно все таблицы с триггерами?
27 май 09, 17:55    [7236464]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
martin_bishop
Если мы ведь говорим не о самом "верхнем". а о только "сразу над" слое, то этот "над" пусть и тыкается во вторую-третью.
А потом эскалирует полное не смог ещё выше. своему мастеру


Т.е. мастер должен гарантированно уметь обработать ЛЮБОЙ эксепшен, который пришел ему с "низлежащих слоев"? Как Вы предполагаете написать такой один УНИВЕРСАЛЬНЫЙ обработчик исключительной ситуации в зависимости от ее типа? Или, это будет, таки

IF @@trancount <> 0 ROLLBACK

Тогда чем это отличается от реализации отката в самой бд?!
27 май 09, 17:56    [7236473]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
martin_bishop
locky
Потому что формально - это две разных БД с РАЗНОЙ структурой.


Почему же разная?

В базе с триггерами наверняка есть и чеки и форэин ключи ...

Потому что в вашем примере в одном случае есть чек, в другом - триггер.
Это разные базы с разной структурой.
27 май 09, 17:58    [7236482]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
To pkarklin:

Я не знаю способа сымитировать вложенную транзакцию в MS кроме как через savepoint
Но savepoint не увеличивает и не уменьшает счётчик транзакции.
По-этому счётчик на входе в хп или 0 (тогда эта хп становится мастером и увеличивает его до 1, с тем, чтобы в конце или откатить или принять, т.е. уменьшить до 0)
или 1 (тогда эта хп уже вложена внутрь хп-мастера)
Все вложенные хп уже не смогут начать транзакцию (счётчик = 1 и эта хп уже может быть только слэйвом)
тогда слэйву остаётся savepoint (равно как и всем вложенным)

Я не предлагаю написать универсальный. Только на то что знаю на данный момент.
Остальное - raiserror ('exception Not emplemented')
а нижних слоёв может быть много.

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

Надо ли расценивать Ваш ответ что "если в базе есть хоть один триггер, то нет ни одного констраинта?"
27 май 09, 18:11    [7236557]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
martin_bishop

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

Надо ли расценивать Ваш ответ что "если в базе есть хоть один триггер, то нет ни одного констраинта?"

Нет.
В вашем примере два одинаковых стейтмента вели себя по разному в зависимости от того, чем и как было реализовано ограничение - чеком или триггером.
Следовательно, в одном примере был чек, во втором - триггер (но не единовременно и то и другое). Следовательно, это две разные базы с двумя разными структурами. Следовательно, они могут вести себя по разному.
27 май 09, 18:31    [7236633]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
locky
Нет.
В вашем примере два одинаковых стейтмента вели себя по разному в зависимости от того, чем и как было реализовано ограничение - чеком или триггером.
Следовательно, в одном примере был чек, во втором - триггер (но не единовременно и то и другое). Следовательно, это две разные базы с двумя разными структурами. Следовательно, они могут вести себя по разному.


Я привёл этот пример на одной таблице только чтобы сравнение было качественным.
Чтобы концептуальное различие было очевидным.

Специально для Вас я могу переписать этот пример с двумя инсёртами последовательно, один за другим.
На первой тбл, как Вы уже догадались, будет триггер, а на второй тбл - чек.
27 май 09, 18:38    [7236658]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
martin_bishop

Я привёл этот пример на одной таблице только чтобы сравнение было качественным.
Чтобы концептуальное различие было очевидным.

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

Да, сделайте для меня специально пример, с двумя табличками, пусть на одной будет триггер, на другой будет чек.
И я в очередной раз скажу, что не вижу ничего удивительного в том, что одинаковые операции над объектами с разной структурой приводят к разному результату.
27 май 09, 18:55    [7236716]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
locky
И я в очередной раз скажу, что не вижу ничего удивительного в том, что одинаковые операции над объектами с разной структурой приводят к разному результату.

А Вы не путаете понятие "структура" с понятием "реализация защитного механизма"?

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

Итак в ведённых терминах:

таблице с определённой структурой при попытке инсёрта срабатывает защитный механизм (ЗМ).
И система имеет возможность среагировать на срабатывание ЗМ"

Надеюсь что сейчас нарушение концепции более очевидно с роллбэком в триггере ...
27 май 09, 19:24    [7236791]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
martin_bishop
Итак в ведённых терминах:

таблице с определённой структурой при попытке инсёрта срабатывает защитный механизм (ЗМ).
И система имеет возможность среагировать на срабатывание ЗМ"

Надеюсь что сейчас нарушение концепции более очевидно с роллбэком в триггере ...

Ок, примем новые термины.
В свете новых терминов я не вижу причины, по которой разным защитным механизмам не вести бы себя по разному.

зы насколько я понимаю, я не путаю, что есть "структура".
27 май 09, 19:27    [7236797]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
locky
Следовательно, в одном примере был чек, во втором - триггер (но не единовременно и то и другое). Следовательно, это две разные базы с двумя разными структурами. Следовательно, они могут вести себя по разному.

В про такой принцип, как инкапсуляция, слышали? Естественно, его можно нарушать - вопрос, в основном, об удобстве программирования. Я надеюсь, что вам преимущества программирования с его соблюдением известны.
В данном случае очень удобно если логика и правила проверки целостности полностью скрыты внутри DML-оператора. Тогда код, его использующий, не должен задумываться о том, как реализовано ограничение. Контракт DML-оператора предельно прост - есть всего две возможности - он сообщит либо об успешном выполнении, либо об ошибке. Соответственно код его вызывающий либо продолжит выполнение, либо займется обработкой исключения.
27 май 09, 19:33    [7236811]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Bogdanov Andrey
В данном случае очень удобно если логика и правила проверки целостности полностью скрыты внутри DML-оператора. Тогда код, его использующий, не должен задумываться о том, как реализовано ограничение. Контракт DML-оператора предельно прост - есть всего две возможности - он сообщит либо об успешном выполнении, либо об ошибке. Соответственно код его вызывающий либо продолжит выполнение, либо займется обработкой исключения.

:)
Раз уж вспомнили об "инкапсуляции"...

public void SomeProc()
{
.... do some work
if (someCondition) { ErrorFlag = -1;}
}

public void SomeOtherProc()
{
 ... do some work
if (someCondition) {throw new Exception();}
}

несложно заметить, что при формальном вызове этих процедур (каждая из которых проводит свои проверки) необходимо предпринимать разные телодвижения.
Почему нужно делать разные телодвижения? Потому что процедуры - разные.
и если вы после вызова процедуры не будете проверять флаг (как нужно делать в первом случае) или не обернёте вызов в try catch (как нужно делать во втором случае) - будете ли вы удивлены полученным результатам?
Я думаю, что не будете.
27 май 09, 20:25    [7236935]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

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

Обращаюсь ко всем защитникам роллбэка в триггерах, как средства соблюдения ACID (его первой буквы):

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

Введём терминологию:
M(andatory) - операция должна быть исполнена, если нет, то откат всей транзакции
O(ptional) - операцию желательно исполнить, если нет, то не больно-то и хотелось ...

1. операция на таблице 1 (M)
2. операция на таблице 2 (M)
3. операция на таблице 3 (O)
4. операция на таблице 4 (M)

Я считаю эти 4 такта одним атомом и оборачиваю в одну транзакцию.

Теперь вопрос:

Логика этих 4х операций нарушает принцип A(CID)?
Если нет, то ваш роллбэчный триггер навернёт мой атом на 3-м шаге даже если все остальные прошли бы ...

-------------
Не человек служит транзакции, а транзакция человеку.
Я считаю триггер лишь "продвинутым" констраинтом.
27 май 09, 20:37    [7236957]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
я уже приподустал ...


Я уже тоже.

автор
1: O(ptional) - операцию желательно исполнить, если нет, то не больно-то и хотелось ...

2: 3. операция на таблице 3 (O)

3: Я считаю эти 4 такта одним атомом и оборачиваю в одну транзакцию.


Выделенное в 3 противоречит 1. Нечего делать 2 в 3 при условии 1.

И Ваше "желательно" противоречит ACID.
27 май 09, 20:49    [7236981]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
pkarklin
И Ваше "желательно" противоречит ACID.


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

Где здесь противоречие?
это нормальная операция с двумя исходами (оба из которых для данного алгоритма приемлемы)

это обычное ветвление алгоритма. и этот(ветвящийся) узел тоже можно считать операцией которая последовательно выполняется за 2й и перед 4й обязательными ...
27 май 09, 21:04    [7237019]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

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

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

Где здесь противоречие?
это нормальная операция с двумя исходами (оба из которых для данного алгоритма приемлемы)

это обычное ветвление алгоритма. и этот(ветвящийся) узел тоже можно считать операцией которая последовательно выполняется за 2й и перед 4й обязательными ...


Гм... Насколько мне известно, A трактуется как "любые части (подоперации) транзакции либо выполняются все, либо не выполняется ни одной такой части". Поэтому странно слышать в такой трактовке "хочу попробовать, если удастся - хорошо, нет - в другой раз".
27 май 09, 21:20    [7237048]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
martin_bishop

Нет, не противоричит.
это обычное ветвление алгоритма.

если вы способны выделить составляющие - это не атом. всё, или ничего.
сранно, что вообще приходится об этом говорить
27 май 09, 21:22    [7237052]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
pkarklin
любые части (подоперации) транзакции либо выполняются все, либо не выполняется ни одной такой части


операция А - приемлем только успешный исход
операция В - приемлем любой исход
операция С - приемлем только успешный исход

эти три операции я хочу выполнить как одно целое.

А то что операция В считается выполненной при любом исходе (в данном алгоритме) , так это сродни х := х.
И не противоречит определению.

Т.е. транзакция опрашивает энжин:
- операция А; ответ выполнена (с положительным результатом)
- операция В; ответ выполнена (с отрицательным результатом)
- операция С; ответ выполнена (с положительным результатом)

Прекрасно!. Тогда комит!

To Зайцев Фёдор:
Атом это не только одна операция :-)
Обычно говорят: "Выполнить несколько операций как одну"

Чувствуете разницу?
27 май 09, 21:31    [7237083]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
To Зайцев Фёдор:

Если бы операции нельзя было бы выделить из одной,
то не появилось бы вообще понятия "Транзакционная скобка"

Странно что об этом вообще нужно говорить
27 май 09, 21:34    [7237091]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
От того что операция В не может быть невыполненной (или исход неважен, что, в сущности одно и то же), она не перестаёт быть операцией и, как следствие, имеет право попасть внутрь транзакционной скобки
27 май 09, 21:41    [7237107]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 14 15 16 17 18 [19] 20 21 22 23 .. 25   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить