У нас есть процесс обновления базы данных, который использует следующий SQL
IF NOT EXISTS (SELECT * FROM Target_Table WHERE Target_Table_ID = ...)
BEGIN
INSERT ...
END
ELSE
BEGIN
UPDATE ...
END
. Я хотел изменить это на использование оператора MERGE
, чтобы избежать возможного состояния гонки, когда IF
итогда операторы INSERT
или UPDATE
оцениваются отдельно.
Однако, как только я выполнил запрос, я получил ошибку:
Таблица назначения Target_Table изОператор MERGE не может иметь никаких разрешенных правил.Найдено правило 'TargetTable_RULE'
Я понимаю, что в документации говорится, что в таблице не могут быть включены правила, хотя я пропустил ее при первом чтении и кроме отключения правила перед выполнением MERGE
(котороеЯ не вижу работоспособного решения) кажется, что я застрял с решением IF NOT EXISTS
.
В документе не объясняется, что почему целевой таблице не разрешеноесть правила.В моем случае это простая проверка > 0
значения.
Кто-нибудь знает, почему правила не разрешены в этой ситуации и есть ли другой способ выполнить upsert атомарным способом?
РЕДАКТИРОВАТЬ: Как прокомментировал Andriy M вопрос Atomic UPSERT в SQL Server 2005 уже обладает обширной информацией об атомных приложениях, поэтому я не буду повторять здесь обсуждение.Вместо этого я хотел бы просто знать, почему оператор MERGE
не может выполняться в таблицах с определенными правилами и есть ли обходной путь?