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

Откуда:
Сообщений: 234
Добрый день.
Может кто-нибудь сможет мне прояснить следующий вопрос.
Есть Merge statement c двуме секциями WHEN MATCHED THEN UPDATE и WHEN NOT MATCHED THEN INSERT.
На таблице есть уникальный constraint по нескольким полям.

В том случае, если MERGE STATEMENT сначала выполняет UPDATE записи, а потом INSERT - он нарушаться не будет.
Но вот если сначала произойдет INSERT, а затем UPDATE - будет нарушение CONSTRAINT.

Соответственно вопрос. Правильно ли Merge statement разрешит эту ситуацию сам? И соответственно у меня никогда не будет нарушения unique constraint.
Или это мне просто пока в процессе тестирования везет и я не воспроизвел эту ситуацию?
19 мар 12, 11:00    [12272018]     Ответить | Цитировать Сообщить модератору
 Re: Merge statement - поведение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Павел-П,

MERGE выполнит ЛИБО вставку, ЛИБО изменение, если возможны несколько вариантов, то он выдаст ошибку.
19 мар 12, 11:06    [12272053]     Ответить | Цитировать Сообщить модератору
 Re: Merge statement - поведение  [new]
Павел-П
Member

Откуда:
Сообщений: 234
iljy
Павел-П,

MERGE выполнит ЛИБО вставку, ЛИБО изменение, если возможны несколько вариантов, то он выдаст ошибку.


Это понятно. В моем случае все зависит от того в каком порядке он выполнит вставку и изменение.
Если сначала изменение, а потом вставка - все хорошо.
Пока как я его не гоняю, у меня все работает корректно.
Т.е. constraint не нарушается.
19 мар 12, 11:14    [12272117]     Ответить | Цитировать Сообщить модератору
 Re: Merge statement - поведение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Павел-П,

проверка ограничений выполняется по результату всей операции.
19 мар 12, 11:44    [12272368]     Ответить | Цитировать Сообщить модератору
 Re: Merge statement - поведение  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел-П
Это понятно. В моем случае все зависит от того в каком порядке он выполнит вставку и изменение.
Если сначала изменение, а потом вставка - все хорошо.

Для одной записи выполнится либо insert либо update. А не обе команды.
А порядоком обработки записей вы не управляете
19 мар 12, 11:45    [12272375]     Ответить | Цитировать Сообщить модератору
 Re: Merge statement - поведение  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Glory,

Спасибо за ответ.

В моем случае имеет таблицу с полями BusinessKey, EndDate, Field1
Есть уникальный constraint по BusinessKey, EndDate, Field1

Как только поле Field1 изменяется - то вставляется новая запись с EndDate = '9999-12-31', а предыдущая закрывается EndDate = GETDATE().

Т.е. не хотелось бы, чтобы в один и тот же момент времени в таблице оказалось 2 записи с EndDate = '9999-12-31'.

Из предыдущего комментария от iljy
"проверка ограничений выполняется по результату всей операции"

Я просто хочу понять действительно ли у меня всегда будет все хорошо.
19 мар 12, 11:53    [12272435]     Ответить | Цитировать Сообщить модератору
 Re: Merge statement - поведение  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел-П
Как только поле Field1 изменяется - то вставляется новая запись с EndDate = '9999-12-31', а предыдущая закрывается EndDate = GETDATE().

"то вставляется" кем\чем ? триггером ?
19 мар 12, 11:58    [12272474]     Ответить | Цитировать Сообщить модератору
 Re: Merge statement - поведение  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Glory,

Изначально в теле Merge statement формируется Source с новыми значениями колонок (BusinessKey, StartDate, EndDate, Field1).
Затем он просто мержится с Target по полям BusinessKey, StartDate - это ключ таблицы.
Но по BusinessKey и EndDate - тоже есть уникальный constraint.

Т.е. сам Merge statement обновляем предыдущую запись(закрывает EndDate), а затем вставляет новую с EndDate = '9999-12-31'.

Вот я и пытаюсь понять может здесь быть конфликт или нет?
19 мар 12, 12:07    [12272565]     Ответить | Цитировать Сообщить модератору
 Re: Merge statement - поведение  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Павел-П, все операции в скуле целостные и атомарные. Не надо придумывать себе проблемы от незнания.
19 мар 12, 12:58    [12272993]     Ответить | Цитировать Сообщить модератору
 Re: Merge statement - поведение  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел-П
Т.е. сам Merge statement обновляем предыдущую запись(закрывает EndDate), а затем вставляет новую с EndDate = '9999-12-31'.

Вы почему то думаете, что изменения данных уже обработанных записей вступают в действие сразу

The MERGE statement cannot update the same row more than once, or update and delete the same row.
19 мар 12, 13:12    [12273104]     Ответить | Цитировать Сообщить модератору
 Re: Merge statement - поведение  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Mnior
Павел-П, все операции в скуле целостные и атомарные. Не надо придумывать себе проблемы от незнания.


Спасибо большое за ваши сообщения.
Да я об целостных и атомарных операциях знаю, просто что-то это сегодня меня засмущало.
Решил, потестировать какие они целостные и атомарные. Проблем не нашел. Решил уточнить у умных людей.
19 мар 12, 14:15    [12273757]     Ответить | Цитировать Сообщить модератору
 Re: Merge statement - поведение  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
[quot Павел-П]
Mnior
Проблем не нашел. Решил уточнить у умных людей.
Вот одна из "проблем".
19 мар 12, 21:55    [12277373]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить