UPDATE недопустим, потому что оператор обновляет представление «table_name», которое участвует в соединении и имеет триггер INSTEAD OF UPDATE. - PullRequest
5 голосов
/ 21 июня 2010

Я получаю следующую ошибку при выполнении следующего запроса в хранимой процедуре.Может ли кто-нибудь помочь в обнаружении ошибки?

UPDATE не допускается, поскольку оператор обновляет представление "sup_item", которое участвует в соединении и имеет триггер INSTEAD OF UPDATE.

UPDATE si
SET 
    name = mc.name,
    sup_item_cat_id = mc.res_sup_item_cat_id,
    xf_value = mc.xf_value,
    ava_start_date = mc.ava_start_date,
    ava_end_date = mc.ava_end_date,
    status_code = mc.status_code,
    last_mod_us_id = CASE WHEN mc.last_mod_us_id = 42 THEN @posting_us_id 
                     ELSE mc.last_mod_us_id END,
    last_mod_tsp = CURRENT_tsp
FROM sup_item AS si
    JOIN merch_cat_imp_sup_item AS mc
        ON mc.sup_id = si.sup_id
        AND mc.res_sup_item_id = si.sup_item_id
        AND mc.cat_imp_event_id = @cat_imp_event_id
        AND mc.accept_flag = 'y'
WHERE si.shi_flag = 'n'

Я нашел ссылку: http://msdn.microsoft.com/en-us/library/ms177523.aspx

Представление с триггером INSTEAD OF UPDATE не может быть целью UPDATE с предложением FROM.

Поэтому мне нужно переписать оператор UPDATE (он все еще может быть в процедуре), чтобы НЕ использовать sup_item (который является представлением), но при необходимости сохранить базовые таблицы.

Может кто-топерепишите пожалуйста, если кто знает что делать?

Ответы [ 4 ]

15 голосов
/ 25 марта 2011

Вы можете использовать MERGE для достижения этой цели.Попробуйте:

MERGE INTO  sup_item  si
USING merch_cat_imp_sup_item AS mc
        ON mc.sup_id = si.sup_id
        AND mc.res_sup_item_id = si.sup_item_id
        AND mc.cat_imp_event_id = @cat_imp_event_id
        AND mc.accept_flag = 'y'
        AND si.shi_flag = 'n'
WHEN MATCHED
THEN UPDATE
SET 
    name = mc.name,
    sup_item_cat_id = mc.res_sup_item_cat_id,
    xf_value = mc.xf_value,
    ava_start_date = mc.ava_start_date,
    ava_end_date = mc.ava_end_date,
    status_code = mc.status_code,
    last_mod_us_id = CASE WHEN mc.last_mod_us_id = 42 THEN @posting_us_id 
                     ELSE mc.last_mod_us_id END,
    last_mod_tsp = CURRENT_tsp
2 голосов
/ 21 июня 2010

Проблема не в вашем запросе.Согласно комментариям на ваш вопрос, сущность, которую вы обновляете [sup_item], на самом деле не таблица, это представление.Это представление имеет триггер INSTEAD OF UPDATE.

Можете ли вы опубликовать SQL для представления и для триггера (ов)?

0 голосов
/ 22 октября 2015

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

Вы должны заменить синтаксис "update from" стандартным синтаксисом обновления ANSI.

0 голосов
/ 28 октября 2014

Мне также было бы интересно, потому что у меня есть хранимая процедура в базе данных, которую я унаследовал, которая пытается сделать это. Он не позволит мне создать sproc в SQL 2014, но тот факт, что он есть в sproc, указывает мне, что более ранняя версия SQL-сервера, должно быть, позволяла это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...